Java:更新ArrayList中的GUI元素

Java:更新ArrayList中的GUI元素,java,swing,arraylist,jcomponent,Java,Swing,Arraylist,Jcomponent,我必须为我的最后一次Java学校作业制作一个游戏。在其中,我用定制的“Peg”对象填充JPanel,这些对象在for循环中扩展JComponent。JPanel使用GridBagLayout。在for循环中,我将“Peg”对象添加到ArrayList,然后从该ArrayList获取元素,并将其添加到JPanel。这一切都是通过一个如下所示的方法完成的: public void createDummyPegs() { for (int i = 0; i < 13; i++)

我必须为我的最后一次Java学校作业制作一个游戏。在其中,我用定制的“Peg”对象填充
JPanel
,这些对象在for循环中扩展
JComponent
JPanel
使用
GridBagLayout
。在for循环中,我将“Peg”对象添加到
ArrayList
,然后从该
ArrayList
获取元素,并将其添加到
JPanel
。这一切都是通过一个如下所示的方法完成的:

public void createDummyPegs()
{
    for (int i = 0; i < 13; i++)
    {
        initPegsArray.add(new ArrayList<>());
        dummyPegsConstraints.gridy = i;

        for (int j = 0; j < 5; j++)
        {
            dummyPegsConstraints.gridx = j;

            if (i == 0)
            {
                tempColorPeg = new ColorPeg(Color.DARK_GRAY);
                initPegsArray.get(i).add(j, tempColorPeg);
                pegsLeftPanel.add((JComponent) initPegsArray.get(i).get(j),
                                   dummyPegsConstraints);
            }
            else
            {
                tempDummyPeg = new DummyPeg();
                initPegsArray.get(i).add(j, tempDummyPeg);
                pegsLeftPanel.add((JComponent) initPegsArray.get(i).get(j), 
                                   dummyPegsConstraints); 
            }
        }
    }
}
我不明白为什么第一次添加到
ArrayList
时它能工作,但第二次却不行

如有任何指导意见,将不胜感激。以下是完整的代码(如果有帮助):


我觉得自己很傻,但我想我能理解。在向数组添加一个新的“Peg”并将其传递给JPanel之后,我调用了
update()
。通过调用
revalidate()
现在新的“Peg”被添加到面板中。希望这能帮助其他人解决类似问题。

ArrayList不会更新屏幕上的组件,它们之间没有连接。更新
ArrayList
时,您还必须从屏幕上删除旧的peg,并将其替换为新的peg哦,是的,我知道。我实际上是将组件保存到ArrayList中,然后将ArrayList中的元素添加到JPanel中。如果您查看上面的代码
pegsLeftPanel.add((JComponent)initPegsArray.get(i).get(j),dummyPegsConstraints)这样做。当你更换它时呢?替换组件不会使用现有的组件约束。此外,组件大小也不会更新,直到父容器更新并以AgainCol布局,谢谢您的评论。我认为它可能帮助我解决了这个问题,但我需要继续测试以完全确定。
com.rburgos.mastermindtestlayout.ColorPeg[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=]