为什么 BoxLayout 不允许我更改 JButton 的宽度,而允许我更改高度?

2022-09-01 21:42:46

我试图让我的布局适合我正在移植到Java的程序所具有的特定外观,我以前使用过几个布局管理器,取得了巨大的成功,但由于某种原因,我似乎根本无法做到这一点。我的目标是让右(东)侧包含一个“查找下一个”和“取消”按钮,然后按自上而下的顺序,然后在下面的任何额外空间,以便两个按钮始终位于的顶部,但由于某种原因,它不断忽略任何更改(这是我丢失的地方)宽度的尝试。代码如下。JDialogJDialogJDialogBoxLayoutJButton

JButton findNext = new JButton("Find Next");
JButton cancel = new JButton("Cancel");
cancel.setPreferredSize(new Dimension((int)findNext.getPreferredSize().getWidth(),  
    (int)cancel.getPreferredSize().getHeight()));

JPanel example = new JPanel();  
example.setLayout(new BoxLayout(example, BoxLayout.Y_AXIS));  
example.add(findNext);
example.add(cancel);  
example.add(Box.createGlue());  

无论我尝试什么,始终保持其正常尺寸。我已经尝试过,并且参数与没有运气的参数相同。我甚至尝试过,按钮高度是唯一调整的东西,它仍然保留了它给出的默认宽度。cancelsetMinimumSize()setMaximumSize()setPreferredSizecancel.setPreferredSize(new Dimension(500, 500));

为了解决任何问题,这是它的外观(现在我已经完成了它),你会看到“查找下一个”和“取消”按钮的大小不同。

example image


答案 1

我知道这是一个老问题,但我真的没有看到一个很好的解释。因此,为了偶然发现这一点的搜索者,我将添加我的两分钱。

有三种方法与 Swing 中的大小调整组件相关联:setPreferredSize()、setMinimumSize() 和 setMaximumSize()。但是,重要的一点是,这取决于所使用的特定布局管理器是否支持这些方法中的任何一个。

对于 BoxLayout(原始海报使用的布局):

  • setMinimumSize() -- honors thisBoxLayout
  • setMaximumSize() -- honors thisBoxLayout
  • setP referSize() -- 如果正在使用X_AXIS,则遵循宽度,如果Y_AXIS正在使用,则遵循高度

OP使用的是Y_AXIS BoxLayout,这就是为什么只有他的身高被改变的原因。

更新:我为所有布局管理器整理了一个页面,其中包含相同的信息。希望它可以帮助一些搜索者:http://thebadprogrammer.com/swing-layout-manager-sizing/


答案 2

您可能不希望 ,它“根据需要增长以吸收其容器中的任何额外空间”。相反,请在按钮之间使用 Box.createVerticalStrut(),如下所示,并在此模拟ControlPanel 中显示。Box.createGlue()

example.setLayout(new BoxLayout(example, BoxLayout.Y_AXIS));
example.add(findNext);
Box.createVerticalStrut(10);
example.add(cancel);

补遗:

添加使它工作。setMaximumSize()

这是在垂直方向上具有相同最大宽度的组件的预期行为,如 Box 布局功能中所述。容器的首选宽度变为(等宽)子项的宽度,X 对齐方式变得无关紧要。BoxLayout

example.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JButton findNext = new JButton("Find Next");
JButton cancel = new JButton("Cancel");
Dimension d = findNext.getMaximumSize();
cancel.setMaximumSize(new Dimension(d));
example.add(findNext);
example.add(cancel);

推荐