Java 替换GridBagLayout中的组件

Java 替换GridBagLayout中的组件,java,swing,awt,jpanel,layout-manager,Java,Swing,Awt,Jpanel,Layout Manager,我创建了一个从JPanel扩展而来的类,该类的布局属性是GridBagLayout。我基本上需要显示一组jlabel(网格),但一旦创建了组件,我就无法替换它。我试图删除我想要更改的组件,然后放置新组件,但结果很奇怪。例如,我创建了一个10x10 JLabel数组,并希望用以下代码替换位置[0][0]和位置[9][9]: //At first i have the jpanel layout completely filled this.remove(0); this.add((JLabel)

我创建了一个从JPanel扩展而来的类,该类的布局属性是GridBagLayout。我基本上需要显示一组jlabel(网格),但一旦创建了组件,我就无法替换它。我试图删除我想要更改的组件,然后放置新组件,但结果很奇怪。例如,我创建了一个10x10 JLabel数组,并希望用以下代码替换位置[0][0]和位置[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();
但只有位置[0][0]看起来不错。我应该如何更换组件


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

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

Component toRemove = getComponent(0);
GridBagLayout layout = (GridBagLayout)getLayout();
GridBagConstraints gbc = layout.getConstraints();
remove(toRemove);
add(new JLabel("Happy"), gbc, 0);
这将使用与要删除的零部件相同的约束添加零部件


当然,所有这些都假设您正在分配
gridx
/
gridy
约束…

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

this.setComponentZOrder(newItem, 0);

这样,我实际上没有删除JPAND上的对象,但是我把新的对象放在了旧的对象上。

@ Stult.Ex:还考虑更新组件。我尝试了你的代码,但是结果完全一样,但是谢谢!我使用gridx/gridy吗