我正在尝试获取我的JDialog
的布局以适应我正在移植到Java的程序的特定外观,我之前使用过几个LayoutManagers并取得了巨大成功某些原因我似乎无法让这个工作。我的目标是让JDialog
的右侧(东侧)按照自上而下的顺序包含“查找下一个”和“取消”按钮,然后是下面的任何额外空格,以便两个按钮始终位于JDialog
的顶部,但由于某种原因,BoxLayout
不断忽略任何改变的尝试(这是我丢失的地方)JButton
的宽度。代码如下。
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());
无论我尝试什么,cancel
始终保持正常大小。我尝试使用与setMinimumSize()
相同的参数setMaximumSize()
和setPreferredSize
但没有运气。我甚至试过cancel.setPreferredSize(new Dimension(500, 500));
并且按钮高度是唯一调整的东西,它仍然保留了它给出的默认宽度。
要清除任何问题,这就是它的样子(现在我已经完成了),你会发现“查找下一个”和“取消”按钮的大小不同。
答案 0 :(得分:45)
我知道这是一个老问题,但我没有看到一个很好的解释。因此,为了找到偶然发现的搜索者,我将加上我的两分钱。
在Swing中调整组件大小有三种方法:setPreferredSize(),setMinimumSize()和setMaximumSize()。然而,重要的一点是,它取决于特定的布局管理器是否尊重任何这些方法。
对于BoxLayout(原始海报正在使用的布局):
BoxLayout
尊重此BoxLayout
尊重此OP正在使用Y_AXIS BoxLayout,这就是为什么只改变他的身高。
更新:我为所有布局管理器整理了一个包含相同信息的页面。希望它可以帮助一些搜索者:http://thebadprogrammer.com/swing-layout-manager-sizing/
答案 1 :(得分:6)
您可能不希望Box.createGlue()
,“grows as necessary吸收其容器中的任何额外空间。”相反,请在按钮之间使用Box.createVerticalStrut()
,如下所示和此ControlPanel
的simulation。
example.setLayout(new BoxLayout(example, BoxLayout.Y_AXIS));
example.add(findNext);
Box.createVerticalStrut(10);
example.add(cancel);
附录:
添加
setMaximumSize()
使其有效。
这是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);
中具有相同最大宽度的组件的预期行为。容器的首选宽度变为(同样宽)子容器的宽度,X对齐变得无关紧要。
{{1}}
答案 2 :(得分:3)
正如对该问题的评论所述,您可以通过切换到setMaximumSize()
来解决问题。但是,正如您所指出的,setPreferredSize()
不起作用。那么,那是什么呢?
对于很多东西Swing,使用BoxLayout
时用于确定实际组件大小的属性有点随机(在我看来)。在确定如何渲染组件时,Swing会在布局管理器上调用layoutComponent()
,这会找出放置所有内容的位置。
BoxLayout
layoutComponent()
的实现涉及调用方法,该方法为您添加到JPanel
的每个组件的宽度和高度创建SizeRequirements
个对象,基于他们的getMinimum/Preferred/MaximumSize()
方法。
稍后,它会调用SizeRequirements.calculateAlignedPositions()
来确定每个组件的正确宽度值,因为您的方向是BoxLayout.Y_AXIS
(高度是使用不同的方法计算的)。从源代码中获取片段,此方法的相关实现如下:
for (int i = 0; i < children.length; i++) {
SizeRequirements req = children[i];
//...
int maxAscent = (int)(req.maximum * alignment);
int maxDescent = req.maximum - maxAscent;
//...
int descent = Math.min(totalDescent, maxDescent);
//...
spans[i] = (int)Math.min((long) ascent + (long)descent, Integer.MAX_VALUE);
}
请注意,totalDescent
是可用宽度,因此descent
始终设置为maxDescent
,该SizeRequirements.maximum
基于JButton.getMaximumSize()
,取自spans[i]
。然后,JButton.setBounds()
的值将在getPreferredSize()
的调用中用作宽度。正如您将注意到的那样,{{1}}从未涉及此处,这就是为什么设置它在这种情况下没有影响。
答案 3 :(得分:0)
通常,如果要确保Swing中组件的大小,您需要使用相同的值调用setMinimumSize()
,setMaximumSize()
和SetPrefferedSize()
。
答案 4 :(得分:0)
如果将按钮放在GridLayout面板中,它们的宽度将相同。
答案 5 :(得分:-1)
button.setMaximumSize(getMaximumSize());