gpt4 book ai didi

java - GridBagLayout:最后一个组件影响网格宽度

转载 作者:行者123 更新时间:2023-12-04 04:42:40 28 4
gpt4 key购买 nike

我正面临 Java 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;
}
}

产生以下窗口:

Problem with GridBagLayout Screenshot

但是这两个 JTextField 应该是相同的宽度。

如果我不添加 JComboBox 一切都很好:

enter image description here

我的问题是:为什么最后一个组件会影响前面组件的网格宽度?对我来说真正奇怪的是,如果 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 s,x=1 处的网格将占据 JPanel 中较大比例的位置。因为 weightx平等的人将根据他们喜欢的大小分享他们需要的地方。

这就是为什么添加 JComboBox “插入”gridx=2。为避免这种情况,您可以决定 JTextField 的列数。当您创建它们时:
JTextField area1 = new JTextField(15);
JTextField area2 = new JTextField(15);

或添加占位符文本,以便 JTextField 的首选大小s 大于 0。
如果你要做
box.setPreferredSize(area1.getPreferredSize());
panel.add(box, gbc);

你会注意到 JComboBox几乎不可见,因为首选尺寸很小,另一方面,这会使您的面板在每一侧都相等。

我还建议您使用新的 GridBagConstraints对于每个组件,以避免复制之前添加的组件的值,然后您不会将值重置为。

关于java - GridBagLayout:最后一个组件影响网格宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662372/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com