我想知道是否有一个可以扩展的Swing组件,这样我就可以隐藏或取消隐藏菜单之类的内容。
作为示例,可以在MS Outlook中找到类似的内容:
这是默认外观,其中所有邮件文件夹都被取消隐藏。但点击小箭头(带圆圈的红色)隐藏了该视图:
我希望在我的Java-GUI中有类似的东西来做同样的事情,而默认情况下应该隐藏包含的组件。我不确定在那个可扩展的“标签”下应该有哪个组件,但是现在我正在考虑一个JTree。
这是我一般的尝试。但是如果你想要一个奖金,你可以考虑这个可扩展菜单必须以流畅,流畅的动画展开的要求,而不是立即隐藏或取消隐藏。例如,后者可以在TeamViewer中找到。那里有一个顶部的菜单栏,可以隐藏或取消隐藏,同时以平滑的动画上下移动。
示例,TeamViewer:
修改
首先我尝试了JSplitPane
,但是移动所有现有组件以适应拆分窗格架构并不是我想要的解决方案。相反,我正在寻找更独立的东西。
我接下来尝试的是使用Swing Timer
使用JFrame
方法扩展setBounds
的宽度。当切换菜单的额外空间时,它完全按照我想要的方式工作。调整大小过程时,JFrame
会变大或变小。但我可以看到这种方法的两个缺点:
为了让我更清楚“黑色空间”的含义,请参阅:
现在你可以看到黑色区域。就像我说的那样,它只能保持半秒甚至更短。使用Swing Timer,我在JFrame的宽度上添加了100个像素。我添加到宽度的值越高,黑色区域越高。如果JFrame
的宽度已完全调整大小,则所有内容的颜色都会再次正确。
所以有人知道为什么会这样吗?这个硬件是相关的还是仅仅是Java或Swing的标准行为?有谁知道这方面的解决方案或解决方法?
答案 0 :(得分:3)
请参阅splitpane。
例如
JSplitPane mainSplitPanel = new JSplitPane();
mainSplitPanel.setDividerLocation(650);
mainSplitPanel.setOneTouchExpandable(true);
答案 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;