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

标签 java swing

我正在使用 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/

相关文章:

java - JMS 多线程概念与 MQ

java - Sonar 可折叠 if 语句

java - JFrame 上 JMenuBar 中的空 JMenuItem

java - Netbeans 构建 GUI;如何禁止 Netbeans 禁止我编辑文本?

java - 为什么 TableRowSorter 弄乱了我的结果?

java 强制 JTextField 仅大写

java - 内部服务器错误 - Python CGI

java - 向 JPanel 添加透明渐变?

java - KeyBindings 和 KeyListeners 之间的区别

java - JTable 不工作