繁体   English   中英

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

[英]Expandable component to hide or unhide another component

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

举个例子,可以在MS Outlook中找到类似的东西:

在此输入图像描述

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

在此输入图像描述

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


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

示例,TeamViewer:

在此输入图像描述


编辑

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

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

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

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

在此输入图像描述

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

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

splitpane

例如

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

如需样品, 请点击此处

在我的问题的编辑部分中可以找到最适合我的解决方案。 我发现延迟时间和帧大小调整的良好组合看起来足够平滑(1毫秒延迟并增加宽度,45像素)。 黑框的问题不再是问题。 现在黑屏的持续时间更短,如果用户等待大约2秒,黑色区域将根本不显示(可见)。 在那种情况下,对我来说没关系,因为用户应该在扩展之后花几秒钟。

对于想要在调整JFrame大小时了解更多关于此黑色区域的所有人,请参阅此处

我在编辑过的问题中描述的解决方案的代码:

    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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM