在JTabbedPane中使用JTextField格式化JPanel

时间:2015-04-24 12:38:26

标签: 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);
[...]

1 个答案:

答案 0 :(得分:2)

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,因此没有任何东西可以绘制。