我正在尝试开发一种手风琴菜单。可以打开/关闭少量(2-12)选项。切换时,会有一个JPanel
,其中包含可见的其他设置。切换时,其他设置将不可见。
我创建了一个SelectableExpandablePanel
类,扩展了JPanel
并实现了ActionListener
和ComponentListener
。该小组在{{1}中包含两件事 - JToggleButton
和子Component
(通常是JPanel,但我不想限制自己将来重复使用此概念)强制执行一列。选择切换按钮后,子项变为可见。取消选择切换后,子项将被隐藏。
当我使用这个组件时,我打算将它放在BoxLayout
的{{1}}内,如示例main方法中所示。
似乎有两个问题我无法克服:
如果我没有指定JPanel
尺寸,它只对每个孩子的宽度足够大,并且对于三个按钮来说足够高。当我点击按钮时,我希望JScrollPane
做它的事情并生成一个垂直滚动条。这种情况没有发生。
我希望切换按钮是包含它们的JPanel的全宽。我认为我在构造函数和JFrame
中所做的事情会处理,但事实并非如此。
下面提供的内容编译并有一个主要方法。如果编译和执行,它会驱动我正在构建的组件,以提供测试框架和重现我正在讨论的问题的能力。
JScrollPane
答案 0 :(得分:2)
请勿尝试自行管理尺寸:
//titleButton.setPreferredSize(new Dimension(getSize().width, titleButton.getPreferredSize().height));
titleButton.setToolTipText(tooltip);
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
//setPreferredSize(new Dimension(childComponent.getPreferredSize().width, titleButton.getPreferredSize().height));
//setSize(new Dimension(childComponent.getPreferredSize().width, titleButton.getPreferredSize().height));
此外,摆脱ActionListener中的setSize()
代码。无论如何,这将被忽略,因为布局管理器将确定大小。
当面板的首选大小大于滚动窗格的大小时,将显示滚动条。如果您对首选大小进行硬编码,则默认布局管理器的用途,并且在添加/删除组件时,首选大小不会更改。
请注意,我通常使用BorderLayout。将按钮放在PAGE_START中,将另一个面板放在CENTER中。组件将自动填充可用空间。
答案 1 :(得分:2)