如何使用JToggleButtons,JPanels和JScrollPanes解决这些大小调整问题?

时间:2015-04-21 19:01:39

标签: java swing jpanel jscrollpane preferredsize

我正在尝试开发一种手风琴菜单。可以打开/关闭少量(2-12)选项。切换时,会有一个JPanel,其中包含可见的其他设置。切换时,其他设置将不可见。

我创建了一个SelectableExpandablePanel类,扩展了JPanel并实现了ActionListenerComponentListener。该小组在{{1}中包含两件事 - JToggleButton和子Component(通常是JPanel,但我不想限制自己将来重复使用此概念)强制执行一列。选择切换按钮后,子项变为可见。取消选择切换后,子项将被隐藏。

当我使用这个组件时,我打算将它放在BoxLayout的{​​{1}}内,如示例main方法中所示。

似乎有两个问题我无法克服:

  1. 如果我没有指定JPanel尺寸,它只对每个孩子的宽度足够大,并且对于三个按钮来说足够高。当我点击按钮时,我希望JScrollPane做它的事情并生成一个垂直滚动条。这种情况没有发生。

  2. 我希望切换按钮是包含它们的JPanel的全宽。我认为我在构造函数和JFrame中所做的事情会处理,但事实并非如此。

  3. 下面提供的内容编译并有一个主要方法。如果编译和执行,它会驱动我正在构建的组件,以提供测试框架和重现我正在讨论的问题的能力。

    JScrollPane

2 个答案:

答案 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)

  1. 删除所有setSize / setPreferredSize调用,让LayoutManager完成它的任务。
  2. 要允许JButtons填充面板的宽度,可以使用BorderLayout(例如,将按钮添加到CENTER,将子容器添加到SOUTH并删除所有这些setSize值以让LayoutManager处理它)。