如何使用布局创建仅水平拉伸、不垂直放大的JTextField?
解决Java GUI邮件布局中文本框垂直拉伸问题
你的问题出在BoxLayout.Y_AXIS的默认行为上——它会让所有组件平分垂直方向的可用空间,所以窗口垂直放大时文本框会跟着被拉长。下面提供几种简单的解决方法:
方法1:添加垂直胶水(推荐)
在所有文本框的下方添加Box.createVerticalGlue(),让多余的垂直空间被胶水占用,文本框保持原高度:
修改myPanel3的初始化代码:
myPanel3.setLayout(new BoxLayout(myPanel3, BoxLayout.Y_AXIS)); myPanel3.add(textfield1); myPanel3.add(textfield2); myPanel3.add(textfield3); myPanel3.add(textfield4); // 添加垂直胶水,把文本框固定在上方 myPanel3.add(Box.createVerticalGlue());
方法2:固定文本框的最大高度
给每个JTextField设置最大高度,限制垂直方向的拉伸,同时保留水平拉伸能力:
在初始化文本框后添加:
// 对每个文本框设置最大高度为其首选高度 Dimension tfSize = textfield1.getPreferredSize(); textfield1.setMaximumSize(new Dimension(Integer.MAX_VALUE, tfSize.height)); textfield2.setMaximumSize(new Dimension(Integer.MAX_VALUE, tfSize.height)); textfield3.setMaximumSize(new Dimension(Integer.MAX_VALUE, tfSize.height)); textfield4.setMaximumSize(new Dimension(Integer.MAX_VALUE, tfSize.height));
方法3:改用GridBagLayout
如果需要更精细的布局控制,可以用GridBagLayout,明确指定组件的拉伸权重:
修改myPanel3的布局:
myPanel3.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; // 水平填充 gbc.weightx = 1.0; // 水平拉伸权重 gbc.weighty = 0.0; // 垂直拉伸权重(0表示不拉伸) gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.insets = new Insets(2,0,2,0); // 上下间距 myPanel3.add(textfield1, gbc); myPanel3.add(textfield2, gbc); myPanel3.add(textfield3, gbc); myPanel3.add(textfield4, gbc); // 添加一个占据剩余垂直空间的组件 gbc.weighty = 1.0; myPanel3.add(new JPanel(), gbc);
完整修改后的代码示例(方法1)
import javax.swing.*; import java.awt.*; public class MailLayout { public static void main(String[] args) { String title = "New Message"; MyWindow myWindow = new MyWindow(title); myWindow.setVisible(true); } } class MyWindow extends JFrame { private JPanel myPanel1 = new JPanel(new FlowLayout(FlowLayout.LEFT)); private JPanel myPanel2 = new JPanel(); private JPanel myPanel21 = new JPanel(); private JPanel myPanel3 = new JPanel(); private JLabel label1 = new JLabel("To:"); private JLabel label2 = new JLabel("Cc:"); private JLabel label3 = new JLabel("Bcc:"); private JLabel label4 = new JLabel("Subject:"); private JLabel label5 = new JLabel("From:"); private JButton button = new JButton("Send"); private JTextField textfield1 = new JTextField(""); private JTextField textfield2 = new JTextField(""); private JTextField textfield3 = new JTextField(""); private JTextField textfield4 = new JTextField(""); public MyWindow(String title) { super(title); myPanel1.add(button); this.add(myPanel1, BorderLayout.NORTH); myPanel21.setLayout(new BoxLayout(myPanel21, BoxLayout.Y_AXIS)); myPanel21.add(label1); myPanel21.add(label2); myPanel21.add(label3); myPanel21.add(label4); myPanel21.add(label5); myPanel2.add(myPanel21); this.add(myPanel2, BorderLayout.WEST); myPanel3.setLayout(new BoxLayout(myPanel3, BoxLayout.Y_AXIS)); myPanel3.add(textfield1); myPanel3.add(textfield2); myPanel3.add(textfield3); myPanel3.add(textfield4); // 添加垂直胶水,占用多余垂直空间 myPanel3.add(Box.createVerticalGlue()); this.add(myPanel3); this.setSize(500, 400); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
内容的提问来源于stack exchange,提问作者traveller12
相关产品推荐
相关产品推荐

