2016-07-29 123 views
1

我想知道是否存在能夠擴展的Swing組件,以便能夠隱藏或取消隱藏菜單等內容。可擴展組件隱藏或取消隱藏其他組件

類似的例子可以的東西在MS Outlook中找到:

enter image description here

這是默認的樣子,所有的郵件文件夾取消隱藏。但點擊小箭頭(圓圈紅)隱藏這一觀點:

enter image description here

我想在我的Java的GUI做同樣類似的東西,而包括組件應該默認爲隱藏。我不確定哪個組件應該在可擴展的「標籤」下,但現在我正在考慮JTree。


這就是我通常嘗試的。但是如果你想要一個額外的烹飪,你可以考慮這個可擴展菜單必須在流暢,流暢的動畫中擴展的需求,而不是立即隱藏或不隱藏。後者可以在TeamViewer中找到。在頂部有一個菜單欄,它可以隱藏或不隱藏,而它可以在平滑的動畫中上下移動。

實施例,的TeamViewer:

enter image description here


EDIT

首先我試圖JSplitPane,但移動所有現有的部件以適應拆分窗格模式不是一個解決方案,我會喜歡。相反,我正在尋找更獨立的東西。

我嘗試的下一件事是使用Swing Timer來擴大JFrame的寬度,使用它的setBounds-方法。當涉及到爲菜單切換額外空間時,它的工作方式與我想要的完全相同。在調整大小過程動畫時,JFrame變大或變小。但是我可以看到這種方法的兩個缺點:

  • 動畫有點慢,不是很完美。我刪除了延遲。目前爲止還不錯,但在這裏首選更順暢的解決方案。但我完全可以接受它如何現在。
  • 一個很大的缺點是,尺寸的增加在舊的和新的寬度之間留下了半個黑色的空間半秒鐘。如果有人知道如何避免這種情況,我會完美解決這個問題。

這樣可以很清楚我的意思與「黑色空間」,請參閱:

enter image description here

現在你可以看到黑色區域。就像我說的那樣,它只剩下半秒鐘甚至更短的時間。使用Swing Timer時,我在JFrame的寬度上添加了100個像素。我給寬度增加的值越高,黑色區域就越高。如果JFrame的寬度已完全調整大小,則所有內容都會以正確的顏色再次顯示。

因此,有誰知道爲什麼會發生這種情況?這個硬件是相關的還是僅僅是Java或Swing的標準行爲?有誰知道這個解決方案或解決方法?

+2

[阿帕奇樞軸(https://pivot.apache.org/)具有手風琴和擴展器。 –

回答

0

它適合對我最好的解決方案可以在我的問題的編輯的零件被發現。我發現延遲時間和幀調整的組合很好,足夠平滑(延遲1毫秒,寬度增加45像素)。黑框問題不再成問題。現在,黑屏的持續時間更短,如果用戶等待2秒左右,黑屏區域將不會顯示(明顯)。在這種情況下,對我來說可以,因爲用戶在擴展之後應該花幾秒鐘時間。

對於每個想要在調整JFrame大小的同時瞭解有關此黑色區域的更多信息,請參見here

我在編輯的問題中描述的解決方案的代碼:

final Timer timer = new Timer(1, null); 
    timer.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent evt) 
     { 

      double width = myFrame.getBounds().getWidth(); 

      if(isExpanded == false) 
       width += FRAME_PIXEL_CHANGE; 
      else 
       width -= FRAME_PIXEL_CHANGE; 



      if(myFrame.getBounds().getWidth() >= FRAME_SIZE_EXPANDED && isExpanded == false) 
      { 
       myFrame.setBounds(FRAME_X, FRAME_Y, FRAME_SIZE_EXPANDED, FRAME_HEIGTH); 
       btnExpand.setIcon(new ImageIcon(GUI.class.getResource("/img/close.png"))); 
       timer.stop(); 
       isExpanded = true; 
      } 
      else if(myFrame.getBounds().getWidth() <= FRAME_SIZE_REGULAR && isExpanded == true) 
      { 
       myFrame.setBounds(FRAME_X, FRAME_Y, FRAME_SIZE_REGULAR, FRAME_HEIGTH); 
       btnExpand.setIcon(new ImageIcon(GUIMain.class.getResource("/img/expand.png"))); 
       timer.stop(); 
       isExpanded = false; 
      } 
      else 
      { 
       myFrame.setBounds(FRAME_X, FRAME_Y, (int) width, (int) FRAME_HEIGTH); 
       btnExpand.setBounds((int) (width-36), 246, 36, 36); 
      } 
     } 
    }); 

    return timer; 
3

請參閱splitpane

例如

JSplitPane mainSplitPanel = new JSplitPane(); 
mainSplitPanel.setDividerLocation(650); 
mainSplitPanel.setOneTouchExpandable(true); 

對於樣品click here

+0

這看起來不錯。我會嘗試。謝謝! – KJaeg

+0

使用JSplitPane並不是我正在尋找的解決方案。它需要太多的工作來按照我想要的方式來設置它。我正在尋找的是一個組件,它通過擴展它自己獲得所需的空間。 JSplitPane或多或少地佔用設置空間並在定義的空間內填充左側或右側面板一側。此外,我有一個完整的GUI,現在需要將其內容移動到左側面板。但我仍會繼續努力,遲早我會以我想要的方式獲得它。 – KJaeg