我遇到了 Javas GridBagLayout 的问题。
运行以下代码:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Main extends JFrame{
public static void main (String [] args){
new Main();
}
public Main(){
add(getPanel());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setSize(600, 150);
}
private JPanel getPanel(){
JPanel panel = new JPanel(new GridBagLayout());
JLabel label1 = new JLabel("Label 1");
JLabel label2 = new JLabel("Label 2");
JLabel label3 = new JLabel("Label 3");
JTextField area1 = new JTextField();
JTextField area2 = new JTextField();
JComboBox<String> box = new JComboBox<String>();
box.addItem("One One One");
box.addItem("Two Two Two");
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(10, 10, 10, 10);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0;
panel.add(label1, gbc);
gbc.gridx = 1;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
panel.add(area1, gbc);
gbc.gridx = 2;
gbc.weightx = 0;
gbc.fill = GridBagConstraints.NONE;
panel.add(label2, gbc);
gbc.gridx = 3;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
panel.add(area2, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.NONE;
gbc.weightx = 0;
panel.add(label3, gbc);
gbc.weightx = 1;
gbc.gridx = 1;
panel.add(box, gbc);
return panel;
}
}
产生以下窗口:
但是两个 JTextField 的宽度应该相同。
如果我不添加 JComboBox 一切都很好:
我的问题是:为什么最后一个组件会影响前面组件的网格宽度?对我来说真正奇怪的是,如果 JComboBox 长度增加,右侧的 JTextField 会变小。实际上,看起来左侧 JTextField 的长度等于右侧 JTextField 的长度 + JComboBox 的长度。 在下一行中有两个长度相等的文本字段和 JComboBox 的技巧是什么?
提前致谢!
最佳答案
根据GridBagLayout informations :
Essentially, GridBagLayout places components in rectangles (cells) in a grid, and then uses the components' preferred sizes to determine how big the cells should be.
由于当您添加 JComboBox
时,它的首选大小大于您的 JTextField
,因此 x=1 处的网格将占据较大比例的位置JPanel
因为相等的 weightx
会根据自己喜欢的大小共享所需的位置..
这就是为什么添加JComboBox
“插入”gridx=2。为了避免这种情况,您可以在创建 JTextField
时决定它们的列数:
JTextField area1 = new JTextField(15);
JTextField area2 = new JTextField(15);
或添加占位符文本,使 JTextField
的首选大小大于 0。
如果你要做
box.setPreferredSize(area1.getPreferredSize());
panel.add(box, gbc);
您会注意到 JComboBox
几乎不可见,因为首选尺寸很小,而另一方面,这将使您的面板每一侧都相等。
我还建议您为每个组件使用新的 GridBagConstraints
,以避免复制之前添加的组件的值(您未重置值)。
关于java - GridBagLayout:最后一个组件影响网格宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662372/