我在使用BoxLayout
时遇到问题。
在我的示例中,我尝试减小文本字段的高度并更改按钮的宽度(如底部图片中的绿色标记所示)。我知道技术setPreferredSize()
和setMaximumSize()
,但是它没有按预期的方式工作。 add(Box.createHorizontalGlue())
行也没有帮助。
感谢任何想法。
public class Testy extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
constructGUI();
}
});
}
private static void constructGUI() {
JFrame frame = new JFrame("Testy");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.DARK_GRAY);
centerPanel.setPreferredSize(new Dimension(100, 400));
frame.add(centerPanel, BorderLayout.CENTER);
Testy eastPanel = new Testy();
frame.add(eastPanel, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
public Testy() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JButton button = new JButton("Button ...... 1");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
button = new JButton("Button 2");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
button = new JButton("Button ........... 3");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
JLabel label = new JLabel("Label");
//label.setPreferredSize(...);
//label.setMaximumSize(...);
add(label);
JTextField textField = new JTextField();
//textField.setPreferredSize(...);
//textField.setMaximumSize(...);
add(textField);
button = new JButton("Button 4");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
//add(Box.createHorizontalGlue());
}
}
首先,您必须意识到Java Swing中组件的位置和大小取决于布局管理器(如果设置了布局管理器),而不取决于组件本身。该组件要求经理提供尺寸。
在这种情况下,我将使用不同的布局-GridLayout和BorderLayout的组合就足够了,而且非常简单明了。但是,如果要使用BoxLayout,则...
文档说:
BoxLayout注意到组件要求的最小,首选和最大尺寸。在微调布局时,可能需要调整这些大小。 ...例如,按钮的最大尺寸通常为与其首选尺寸相同。如果您希望将按钮绘制得更宽当有更多空间可用时,则需要更改其最大尺寸。
然后设置组件的最大大小:c.setMaximumSize(new Dimension(Integer.MAX_VALUE, c.getMinimumSize().height));
(在您的示例中,c
表示button
,label
和textField
)
编辑1:
这里是有效的源代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class Testy extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
constructGUI();
}
});
}
private static void constructGUI() {
JFrame frame = new JFrame("Testy");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.DARK_GRAY);
centerPanel.setPreferredSize(new Dimension(100, 400));
frame.add(centerPanel, BorderLayout.CENTER);
Testy eastPanel = new Testy();
frame.add(eastPanel, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
public Testy() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JButton button = new JButton("Button ...... 1");
//button.setPreferredSize(...);
button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
add(button);
button = new JButton("Button 2");
//button.setPreferredSize(...);
button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
add(button);
button = new JButton("Button ........... 3");
//button.setPreferredSize(...);
button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
add(button);
JLabel label = new JLabel("Label");
//label.setPreferredSize(...);
label.setMaximumSize(new Dimension(Integer.MAX_VALUE, label.getMinimumSize().height));
add(label);
JTextField textField = new JTextField();
//textField.setPreferredSize(...);
textField.setMaximumSize(new Dimension(Integer.MAX_VALUE, textField.getMinimumSize().height));
add(textField);
button = new JButton("Button 4");
//button.setPreferredSize(...);
button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
add(button);
// add(Box.createVerticalGlue());
}
}
编辑2:
如果要布置右列底部的按钮4,请在add(Box.createVerticalGlue());
和add(textField);
之间添加此行button = new JButton("Button 4");
。
作为一种快速的补救方法,可以使用嵌套布局,即在右侧,用JPanel
创建BorderLayout
,在JPanel(say compPanel)
处放置CENTER
,在[[ C0]位置。现在,将新的JPanel(say buttonPanel)
与PAGE_END
一起使用,并将所有组件放在其上,然后将此JPanel(say panel)
放在GridLayout
内。将compPanel
照原样放置在centerPanel
内。
JButton(button4)
相反,相对于给定buttonPanel
的首选大小,该大小通常是基于BoxLayout
持有或明确给出的内容来计算的,因此,组件相对于其他给定给定的大小趋向于不太对齐组件。
这里是工作示例:
JComponent
输出:
根据您的绘图,这应该很接近,只需要在该组件上工作即可在JLabel下方(使用setPreferredSize()):
JComponent