2

我创建了一个从 JPanel 扩展的类,其布局属性是 GridBagLayout。我基本上需要显示一组 JLabels(网格),但是一旦创建了组件,我就无法替换它。我尝试删除要更改的组件,然后放置新组件,但结果很奇怪。例如,我创建了一个 10x10 JLabels 数组,并希望用以下代码替换 position[0][0] 和 position[9][9]:

//At first i have the jpanel layout completely filled

this.remove(0);
this.add((JLabel) start, 0);  //This was created with GridBagLayout.gridx = 0 and GridBagLayout.gridy = 0 and it's fine

this.remove(99);
this.add((JLabel) end, 99); //This was created with GridBagLayout.gridx = 9 and GridBagLayout.gridy = 9 and it's out of grid
this.revalidate();

但只有 position[0][0] 看起来不错。我应该怎么做才能更换一个组件?

在此处输入图像描述

4

2 回答 2

6

GridBagLayout中,每个组件都与 相关联GridBagConstraints。简单地移除一个组件并用相同位置的组件替换它是行不通的,因为新组件将收到一个新的GridBagConstraints

但是,您可以做的是获取与给定组件关联的约束。

Component toRemove = getComponent(0);
GridBagLayout layout = (GridBagLayout)getLayout();
GridBagConstraints gbc = layout.getConstraints();
remove(toRemove);
add(new JLabel("Happy"), gbc, 0);

这将使用与您要删除的组件相同的约束来添加组件。

当然,这一切都假设您正在分配gridx/gridy约束......

于 2013-03-07T05:35:59.513 回答
1

我使用以下方法解决了我的问题:

this.setComponentZOrder(newItem, 0);

所以,我实际上并没有删除 Jpanel 上的对象,而是将新对象放在旧对象上。

于 2013-03-07T19:52:12.970 回答