在JavaSwing中重新绘制电路板
我正在尝试实现一个游戏。它发生在一个9乘9的棋盘上,包含墙壁、一个棋子和空积木。这两个都是GameObject的子类。GameObject扩展了JLabel。我将位置存储在数组中:在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
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。他们的意思是一样的。谢谢你告诉我关于@
。