1

我无法让我的 JLabels 在 2D 数组中在运行时更新。

我正在开发的程序是 Connect Four 的一个变体。我创建了一个 JLabels 的 2D 数组,它们都默认为一个包含空白插槽图像的 ImageIcon。玩家 1 和 2 选择他们的颜色,在轮到玩家时,他可以单击将一块棋子放入一列(重力会导致棋子落到底部或直到它落在另一块棋子的顶部)。

我很肯定我的 addToColumn 方法运行良好。我唯一的问题是我似乎无法更新任何 JLabels。这是我正在研究的方法:

p1、p2 和 current 是 Player 对象。grid[][] 是一个二维整数数组,设置为 0、1 或 2,以便更轻松地跟踪谁拥有哪些图块。tiles[][] 是我的二维 JLabels 数组。

public void addToColumn(int column) { // drop a tile in the specified column
int i = 0;
while (grid[column][5-i] != 0) i++; // move upward through the 6 rows of tiles
                                    // until we find an empty one
if (current == p1) grid[column][5-i] = 1; // update to the current player's value
else grid[column][5-i] = 2;

tiles[column][5-i] = new JLabel(findColorIcon(current.getColor()));

tiles[column][5-i].setIcon(findColorIcon(current.getColor()));

repaint();

现在最后两行更改了tiles [] []中的JLabel,显然我不需要两者,不确定哪种方式更好......这只是我尝试过的一些方法,但无济于事。(我的 getColor() 方法返回一个 Color,findColorIcon(Color c) 返回对应的 JLabel 与该颜色的瓷砖)。

是的,我也在我的 paintComponent 方法中添加了:

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
}

我已经坚持了一段时间了,我觉得我错过了一些明显的东西。有什么建议么?

4

1 回答 1

3

我看不出你的paintComponent()方法有什么作用。特别是,替换 aJLabel需要您validate()使用容器。作为替代方案,您可能想看看这个简单的游戏如何使用模型-视图-控制器模式并绘制彩色图标。

附录:此相关示例描述了如何仅替换Icon. 而不是整个JLabel. 相比之下,这个例子展示了如何在validate()一个容器中替换组件。

于 2011-04-02T09:33:49.507 回答