可扩展组件,用于隐藏或取消隐藏另一个组件

时间:2016-07-29 11:04:42

标签: java swing animation accordion

我想知道是否有一个可以扩展的Swing组件,这样我就可以隐藏或取消隐藏菜单之类的内容。

作为示例,可以在MS Outlook中找到类似的内容:

enter image description here

这是默认外观,其中所有邮件文件夹都被取消隐藏。但点击小箭头(带圆圈的红色)隐藏了该视图:

enter image description here

我希望在我的Java-GUI中有类似的东西来做同样的事情,而默认情况下应该隐藏包含的组件。我不确定在那个可扩展的“标签”下应该有哪个组件,但是现在我正在考虑一个JTree。

这是我一般的尝试。但是如果你想要一个奖金,你可以考虑这个可扩展菜单必须以流畅,流畅的动画展开的要求,而不是立即隐藏或取消隐藏。例如,后者可以在TeamViewer中找到。那里有一个顶部的菜单栏,可以隐藏或取消隐藏,同时以平滑的动画上下移动。

示例,TeamViewer:

enter image description here

修改

首先我尝试了JSplitPane,但是移动所有现有组件以适应拆分窗格架构并不是我想要的解决方案。相反,我正在寻找更独立的东西。

我接下来尝试的是使用Swing Timer使用JFrame方法扩展setBounds的宽度。当切换菜单的额外空间时,它完全按照我想要的方式工作。调整大小过程时,JFrame会变大或变小。但我可以看到这种方法的两个缺点:

  • 动画有点慢而且不够流畅。我删除了延迟。到目前为止,这是相当不错的,但这里更喜欢更顺畅的解决方案。但我现在可以完全了解它的情况。
  • 一个很大的缺点是尺寸的增加会使旧宽度和新宽度之间留下黑色空间半秒钟。如果有人知道如何避免这种情况,我会完全解决这个问题。

为了让我更清楚“黑色空间”的含义,请参阅:

enter image description here

现在你可以看到黑色区域。就像我说的那样,它只能保持半秒甚至更短。使用Swing Timer,我在JFrame的宽度上添加了100个像素。我添加到宽度的值越高,黑色区域越高。如果JFrame的宽度已完全调整大小,则所有内容的颜色都会再次正确。

所以有人知道为什么会这样吗?这个硬件是相关的还是仅仅是Java或Swing的标准行为?有谁知道这方面的解决方案或解决方法?

2 个答案:

答案 0 :(得分:3)

请参阅splitpane

例如

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

样本click here

答案 1 :(得分: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;