我正在使用 JTabbedPane
来控制几个面板,每个面板都包含供用户输入信息的字段。目的是用户可以按任何顺序填写它们,并且可以返回更改先前输入的信息。
JTabbedPane tabs = new JTabbedPane();
tabs.add("Attributes", attributesPanel);
...
frame.add(tabs);
每个面板都使用 GridBagLayout
和 GridBagConstraints
来格式化所有内容。当我不输入任何内容并更改选项卡时,一切看起来都很好。但是,当我在任何 JTextField
中输入任何信息并更改选项卡时,返回选项卡将显示所有内容都聚集在框架中心。
有谁知道这是为什么吗?同样,只有当我在文本字段中实际输入内容时才会发生这种情况......
在面板中,所有内容都在构造函数中初始化。这是一些部分代码:
protected EntityBuilderAttributesPanel() {
setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, EntityBuilder.PANEL_HEIGHT));
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
entityIdLabel = new JLabel("Entity Unique Identity");
entityIdTextField = new JTextField();
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
add(entityIdLabel, c);
c.gridx = 1;
c.gridwidth = 3;
add(entityIdTextField, c);
entityNameLabel = new JLabel("Entity Name");
entityNameTextField = new JTextField();
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
add(entityNameLabel, c);
c.gridx = 1;
c.gridwidth = 3;
add(entityNameTextField, c);
space_01 = new JLabel();
space_01.setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, 25));
c.gridx = 0;
c.gridy = 2;
add(space_01, c);
attributesLabel = new JLabel("Entity Attributes");
c.gridx = 0;
c.gridy = 3;
c.gridwidth = 1;
add(attributesLabel, c);
attributes = new JList(EntityAttribute.values());
attributes.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
attributes.setLayoutOrientation(JList.VERTICAL);
attributes.setVisibleRowCount(10);
JScrollPane listScroller = new JScrollPane(attributes);
listScroller.setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, 400));
listScroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
c.gridx = 0;
c.gridy = 4;
c.gridwidth = 4;
add(listScroller, c);
[...]
最佳答案
listScroller.setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, 400));
问题可能是因为您正在尝试对首选大小进行硬编码。如果组件无法以其首选尺寸显示,则 GridBagLayout 将使用最小尺寸。
而是使用像 list.setVisibleRows(...) 这样的方法,并让列表组件确定高度/宽度。
//entityNameTextField = new JTextField();
entityNameTextField = new JTextField(10);
在创建文本字段时指定一个数字,并再次让文本字段确定合理的大小。
//space_01.setPreferredSize(new Dimension(EntityBuilder.PANEL_WIDTH, 25));
Box.createVerticalStrut(25);
Swing 已经提供了一个透明组件,您可以使用它来代替 JLabel。 Box 组件将更加高效,因为它不像 JLabel 那样使用 UI,因此无需绘制任何内容。
关于java - 在 JTabbedPane 中使用 JTextField 格式化 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29847758/