带有按钮的旋转JPanel无法重绘

问题描述 投票:0回答:1

我目前正在为一个学校项目构建一个简单的扫雷游戏,其中每个字段都是继承JButton的Field类的实例。这里是(大多数)当前状态的类:

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) {
        //...
    }

}

然后这些字段基本上被添加到MineField对象中,该对象继承了JPanel。这也是它的代码:

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);

        // ...
    }

我目前创建的大部分内容似乎都可以正常运行,但有一个例外。那就是我想开始一款与目前难度相同的新游戏的时候。发生的是,所有字段都从窗口中消失了,该窗口有一个空白的MineField(尽管我不确定,可能甚至也没有该窗口)。我该如何解决这个问题?

java swing jpanel
1个回答
0
投票

这对我有用:

[当您要删除旧板JPanel并创建一个新板时。首先,通过调用容器面板(其父面板)对其进行远程处理]

parent.removeAll()

现在,像您一样将新板JPanel转换为父JPanel:

parent.add(mineField, BorderLayout.CENTER);

然后,通过使用JFrame方法,用2种方法一一刷新GUI:

this.revalidate();
this.repaint();
© www.soinside.com 2019 - 2024. All rights reserved.