Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaSwing中重新绘制电路板_Java_Swing - Fatal编程技术网

在JavaSwing中重新绘制电路板

在JavaSwing中重新绘制电路板,java,swing,Java,Swing,我正在尝试实现一个游戏。它发生在一个9乘9的棋盘上,包含墙壁、一个棋子和空积木。这两个都是GameObject的子类。GameObject扩展了JLabel。我将位置存储在数组中: GameObject[][] board = { {null,null,null,null,null,null,null,null,null}, {null,null,null,null,null,null,null,null,null}, {null,null

我正在尝试实现一个游戏。它发生在一个9乘9的棋盘上,包含墙壁、一个棋子和空积木。这两个都是GameObject的子类。GameObject扩展了JLabel。我将位置存储在数组中:

    GameObject[][] board = {
        {null,null,null,null,null,null,null,null,null},
        {null,null,null,null,null,null,null,null,null},
        {null,null,null,null,null,null,null,null,null},
        {null,null,null,null,null,null,null,null,null},
        {null,null,null,null,null,null,null,null,null},
        {null,null,null,null,null,null,null,null,null},
        {null,null,null,null,null,null,null,null,null},
        {null,null,null,null,null,null,null,null,null},
        {null,null,null,null,null,null,null,null,null},
};
对于数组中的每个位置,我都会从字符串中检查哪个游戏对象必须放置在那里,并将其放置在那里。所以这意味着没有什么东西会被放在那里(空的),一堵墙或一个棋子。要将游戏对象(扩展JLabel)添加到我的JPanel,我使用以下代码:

for(int i = 0; i < 9; i++)
        {
            JPanel row = new JPanel(new GridLayout(1,9));
            for(int j = 0; j < 9; j++)
            {
                GameObject col = board[i][j];
                col.setHorizontalAlignment(JTextField.CENTER);
                col.setFont(new Font("SansSerif",Font.BOLD,20));
                col.setOpaque(true);
                col.setBackground(board[i][j].getColor());

                col.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                row.add(col);
                int finalI = i;
                int finalJ = j;
            }
            row.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            panel.add(row);
        }

不幸的是,当我调用最后一段代码时,什么也没有发生。数组确实发生了变化,棋子的内部坐标也发生了变化。但在JPanel中,什么都没有发生。如何确保每次调用move函数时,我的JPanel都会得到更新以反映更改?

我将使您的示例更简单一些

JLabel[][] labels = new JLabel[2][2];
现在有了一个二维数组,其中包含用于jlabel的空间

JPanel panel = new JPanel(new GridLayout(2, 2));
for(int i = 0; i<labels.length; i++){
    for(int j = 0; j<labels[i].length; j++){
        labels[i][j] = new JLabel(i + ", " + j);
        panel.add(labels[i][j]);
    }
}
这会将数组中的JLabel更改为XXX文本,它也是我添加到JPanel中的JLabel,因此更改将反映在屏幕上

labels[0][1] = new JLabel("XXX");
这会将数组更改为指向新的JLabel,但不会影响JPanel中的JLabel。您将在屏幕上看不到任何更改

那么你做了什么:

board[pawn.getRow()][pawn.getCol()] = new Empty(board);
board[pawn.getRow()][pawn.getCol()].setBackground(Color.WHITE);

数组有一个新的空数组,面板中的对象根本没有更改。然后您将新的背景色设置为空,但它不会显示在任何地方。

我将使您的示例更简单一些

JLabel[][] labels = new JLabel[2][2];
现在有了一个二维数组,其中包含用于jlabel的空间

JPanel panel = new JPanel(new GridLayout(2, 2));
for(int i = 0; i<labels.length; i++){
    for(int j = 0; j<labels[i].length; j++){
        labels[i][j] = new JLabel(i + ", " + j);
        panel.add(labels[i][j]);
    }
}
这会将数组中的JLabel更改为XXX文本,它也是我添加到JPanel中的JLabel,因此更改将反映在屏幕上

labels[0][1] = new JLabel("XXX");
这会将数组更改为指向新的JLabel,但不会影响JPanel中的JLabel。您将在屏幕上看不到任何更改

那么你做了什么:

board[pawn.getRow()][pawn.getCol()] = new Empty(board);
board[pawn.getRow()][pawn.getCol()].setBackground(Color.WHITE);

数组有一个新的空数组,面板中的对象根本没有更改。然后您将新面板的背景色设置为空,但它不会显示在任何位置。

更改阵列中的数据与添加到面板中的组件无关。哦,等等,您将棋子放在板中,这根本不会影响布局。只需调用board[x][y].setBackgroundColor,否则您将丢失对该位置标签的引用。“board”是一个数组。这不是你的JPanel。更改“board”数组中的元素不会更改添加到JPanel的组件。您真正想要做的是为每个JLabel使用图标。然后你可以更新每个JLabel的图标。“我误解了你”你,谁?提示:添加@matt(或任何人,
@
很重要)以通知此人新的评论。我误解了@camickr和@matt。他们的意思是一样的。谢谢你告诉我有关
@
。更改阵列中的数据与添加到面板的组件无关。哦,等等,你把棋子放在了棋盘上,这根本不会影响布局。只需调用board[x][y].setBackgroundColor,否则您将丢失对该位置标签的引用。“board”是一个数组。这不是你的JPanel。更改“board”数组中的元素不会更改添加到JPanel的组件。您真正想要做的是为每个JLabel使用图标。然后你可以更新每个JLabel的图标。“我误解了你”你,谁?提示:添加@matt(或任何人,
@
很重要)以通知此人新的评论。我误解了@camickr和@matt。他们的意思是一样的。谢谢你告诉我关于
@