gpt4 book ai didi

java - 在 JTabbedPane 中使用 JTextField 格式化 JPanel

转载 作者:行者123 更新时间:2023-11-30 03:27:27 27 4
gpt4 key购买 nike

我正在使用 JTabbedPane 来控制几个面板,每个面板都包含供用户输入信息的字段。目的是用户可以按任何顺序填写它们,并且可以返回更改先前输入的信息。

JTabbedPane tabs = new JTabbedPane();
tabs.add("Attributes", attributesPanel);
...
frame.add(tabs);

每个面板都使用 GridBagLayoutGridBagConstraints 来格式化所有内容。当我不输入任何内容并更改选项卡时,一切看起来都很好。但是,当我在任何 JTextField 中输入任何信息并更改选项卡时,返回选项卡将显示所有内容都聚集在框架中心。

Crushed image is crushed.

有谁知道这是为什么吗?同样,只有当我在文本字段中实际输入内容时才会发生这种情况......

在面板中,所有内容都在构造函数中初始化。这是一些部分代码:

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/

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