带按钮的 Swing JPanel 无法重绘
Swing JPanel With Buttons Cannot Repaint
我目前正在为学校项目构建一个简单的扫雷游戏,其中每个字段都是继承 JButton 的字段 class 的实例。
这是当前状态下的(大部分)class:
public class Field extends JButton implements MouseListener {
public Field() {
super(" ");
setFocusable(false);
addMouseListener(this);
setFont(new Font("sans serif", Font.PLAIN, 20));
}
@Override
public void mouseClicked(MouseEvent me) {
//...
}
}
然后这些字段基本上被添加到继承 JPanel 的 MineField 对象中。这也是它的代码:
class MineField extends JPanel {
Field[][] fields;
public MineField(int x, int y, int m) {
fields = new Field[x][y];
setLayout(new GridLayout(x, y));
for (int i = 0; i < x; i++) {
for(int j = 0; j < y; j++) {
fields[i][j] = new Field();
add(fields[i][j]);
}
}
//...
}
}
雷区的大小是任意的,根据用户在JMenuBar中选择的难度来生成,方法如下:
private void startBeginner() { startGame(8, 8, 10); }
private void startIntermediate() { startGame(16, 16, 40); }
private void startAdvanced() { startGame(16, 30, 99); }
private void startGame(int x, int y, int m) {
if(mineField != null) {
remove(mineField);
}
mineField = new MineField(x, y, m);
add(mineField, BorderLayout.CENTER);
// ...
}
我现在创建的大部分内容似乎都有效,只有一个例外。那时我想开始一款与当前游戏难度相同的新游戏。发生的情况是所有字段都从 window 中消失,它有一个空白的 MineField(虽然我不确定,它甚至可能不存在)。我该如何解决这个问题?
这对我有用:
当你想删除旧板 JPanel,并创建一个新板时。
首先,通过调用容器面板(它的父级)远程它
parent.removeAll()
现在,像您一样将新的面板 JPanel 添加到父 JPanel:
parent.add(mineField, BorderLayout.CENTER);
然后,使用JFrame方法,通过2种方法一一刷新GUI:
this.revalidate();
this.repaint();
我目前正在为学校项目构建一个简单的扫雷游戏,其中每个字段都是继承 JButton 的字段 class 的实例。 这是当前状态下的(大部分)class:
public class Field extends JButton implements MouseListener {
public Field() {
super(" ");
setFocusable(false);
addMouseListener(this);
setFont(new Font("sans serif", Font.PLAIN, 20));
}
@Override
public void mouseClicked(MouseEvent me) {
//...
}
}
然后这些字段基本上被添加到继承 JPanel 的 MineField 对象中。这也是它的代码:
class MineField extends JPanel {
Field[][] fields;
public MineField(int x, int y, int m) {
fields = new Field[x][y];
setLayout(new GridLayout(x, y));
for (int i = 0; i < x; i++) {
for(int j = 0; j < y; j++) {
fields[i][j] = new Field();
add(fields[i][j]);
}
}
//...
}
}
雷区的大小是任意的,根据用户在JMenuBar中选择的难度来生成,方法如下:
private void startBeginner() { startGame(8, 8, 10); }
private void startIntermediate() { startGame(16, 16, 40); }
private void startAdvanced() { startGame(16, 30, 99); }
private void startGame(int x, int y, int m) {
if(mineField != null) {
remove(mineField);
}
mineField = new MineField(x, y, m);
add(mineField, BorderLayout.CENTER);
// ...
}
我现在创建的大部分内容似乎都有效,只有一个例外。那时我想开始一款与当前游戏难度相同的新游戏。发生的情况是所有字段都从 window 中消失,它有一个空白的 MineField(虽然我不确定,它甚至可能不存在)。我该如何解决这个问题?
这对我有用:
当你想删除旧板 JPanel,并创建一个新板时。 首先,通过调用容器面板(它的父级)远程它
parent.removeAll()
现在,像您一样将新的面板 JPanel 添加到父 JPanel:
parent.add(mineField, BorderLayout.CENTER);
然后,使用JFrame方法,通过2种方法一一刷新GUI:
this.revalidate();
this.repaint();