【问题标题】:Java: Updating a GUI element in an ArrayListJava:更新 ArrayList 中的 GUI 元素
【发布时间】:2012-12-18 04:35:31
【问题描述】:

我必须为我最后的 Java 学校作业创建一个游戏。在其中,我使用定制的“Peg”对象填充JPanel,这些对象在for循环中扩展JComponentJPanel 使用 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); 
            }
        }
    }
}

这很好用,它很好地生成了这些“Peg”对象的网格。这就是问题所在:我有一个按钮,理想情况下应该用另一个不同颜色的“Peg”对象替换这些“Peg”对象之一。当我点击按钮时,我:

  • 使用新的不同颜色创建新的“Peg”对象;
  • ArrayList 中删除一个元素,让我们第一个;
  • 将新的“Peg”添加到旧“Peg”曾经所在的位置(当然假设它最终将位于旧“Peg”曾经所在的位置,并且其他所有内容都将向右移动 1 .

或者,我尝试使用set() 方法来使用新的“Peg”更新给定位置的元素。问题是当我添加新的“Peg”元素时,它似乎没有用大小初始化。将这个新的“Peg”发送到 System.out.println() 语句以读取其中的内容,它会打印出来:

com.rburgos.mastermindtestlayout.ColorPeg[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=]

我不明白为什么我第一次添加到 ArrayList 时它可以工作,但第二次却不行。

任何指导提示将不胜感激。如果有帮助,这里是完整的代码:

【问题讨论】:

  • ArrayList 不会更新屏幕上的组件,它们之间没有任何联系。更新 ArrayList 时,您还必须从屏幕上移除旧钉并用新钉替换它
  • 哦,是的,我知道。我实际上是将组件保存到 ArrayList 中,然后将 ArrayList 中的元素添加到 JPanel。如果您查看上面的代码 pegsLeftPanel.add((JComponent) initPegsArray.get(i).get(j), dummyPegsConstraints); 会这样做。
  • 更换的时候呢?替换组件不会使用现有的组件约束。
  • 另外,在父容器更新并重新布局之前,组件大小不会更新
  • 酷,感谢您的评论。我认为它可能帮助我解决了问题,但我需要继续测试才能完全确定。

标签: java swing arraylist jcomponent


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2015-05-29
    • 2021-05-29
    相关资源
    最近更新 更多