Java 用于隐藏或取消隐藏其他组件的可扩展组件

Java 用于隐藏或取消隐藏其他组件的可扩展组件,java,swing,animation,accordion,Java,Swing,Animation,Accordion,我想知道是否有一个Swing组件可以扩展,这样我就可以隐藏或取消隐藏菜单之类的东西 例如,可以在MS Outlook中找到类似的内容: 这是默认外观,其中所有邮件文件夹都未隐藏。但单击小箭头(红色圆圈)会隐藏该视图: 我希望在我的JavaGUI中有类似的东西来做同样的事情,而默认情况下应该隐藏包含的组件。我不确定那个可扩展的“选项卡”下应该有什么组件,但现在我正在考虑一个JTree 这是我通常尝试的。但是如果你想要奖金,你可以考虑这个扩展菜单必须在流畅流畅的动画中扩展,而不是立即隐藏或隐藏

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

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

这是默认外观,其中所有邮件文件夹都未隐藏。但单击小箭头(红色圆圈)会隐藏该视图:

我希望在我的JavaGUI中有类似的东西来做同样的事情,而默认情况下应该隐藏包含的组件。我不确定那个可扩展的“选项卡”下应该有什么组件,但现在我正在考虑一个JTree


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

例如,TeamViewer:


编辑

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

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

  • 动画有点慢,不是很平滑。我取消了延迟。到目前为止,这还可以,但这里首选更平滑的解决方案。但我完全可以接受目前的情况
  • 一个很大的缺点是尺寸的增加会在新旧宽度之间留下半秒的黑色空间。如果有人知道如何避免这种情况,我将有我的完美解决方案来解决这个问题
为了更清楚我所说的“黑色空间”的含义,请参见:

现在你可以看到那个黑色区域了。就像我说的,它只剩下半秒甚至更少。使用Swing定时器,我在JFrame的宽度上增加了100个像素。我向宽度添加的值越高,黑色区域越高。如果
JFrame
的宽度已完全调整,则所有内容的颜色都将恢复正常

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

请参阅

比如说

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

对于样本

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

如果您想在调整JFrames大小时了解更多关于此黑色区域的信息,请参阅

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

    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;
final Timer=新定时器(1,空);
timer.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件evt)
{
双宽度=myFrame.getBounds().getWidth();
如果(isExpanded==false)
宽度+=帧像素变化;
其他的
宽度-=帧像素变化;
if(myFrame.getBounds().getWidth()>=FRAME\u SIZE\u EXPANDED&&isExpanded==false)
{
myFrame.setBounds(框X、框Y、框大小、框高);
btnExpand.setIcon(新的ImageIcon(GUI.class.getResource(“/img/close.png”));
timer.stop();
isExpanded=true;
}

else if(myFrame.getBounds().getWidth())有手风琴和扩展器。使用JSplitPane并不是我真正想要的解决方案。按照我想要的方式设置它需要太多的工作。我想要的是一个组件,它通过扩展自己获得所需的空间。JSplitPane或多或少地占用了设置的空间并填充了左侧或右侧在定义的空间内的面板侧。此外,我有一个完整的GUI,现在需要将其内容移动到左侧面板侧。但我仍将继续工作,迟早我会按照我想要的方式获得它。