2016-07-29 127 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