我使用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);
[...]
答案 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,因此没有任何东西可以绘制。