Swing 发生操作时,图形平面二维对象不会渲染

Swing 发生操作时,图形平面二维对象不会渲染,swing,Swing,我正在设计一个秋千游戏。目前我正在为这个游戏设计迷宫。迷宫采用深度优先搜索算法生成。在我的主JFrame中,我有一些JPanel。一个名为mazePanel的JPanel包含迷宫。还有其他一些JPanel,其中包含用于控制的JButton。以下是mazePanel代码 import java.awt.Graphics; import javax.swing.BorderFactory; import javax.swing.JPanel; public class MazePanel exte

我正在设计一个秋千游戏。目前我正在为这个游戏设计迷宫。迷宫采用深度优先搜索算法生成。在我的主JFrame中,我有一些JPanel。一个名为mazePanel的JPanel包含迷宫。还有其他一些JPanel,其中包含用于控制的JButton。以下是mazePanel代码

import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class MazePanel extends JPanel {

    private MazeGenerator mazeGenerator;
    private boolean startNewMaze = false;

    public MazePanel() {
        setBorder(BorderFactory.createTitledBorder("Maze"));
        setToolTipText("This is the maze");
    }

    public void addNewMaze() {
        startNewMaze = true;
        mazeGenerator = new MazeGenerator();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (startNewMaze) {
            mazeGenerator.generate(g);
            startNewMaze = false;
        }
    }
} 
有一个JButton,它调用方法mazePanel.addNewMaze(),并将布尔startNewMaze设置为true。设置startNewMaze后,应生成迷宫。i、 e.mazeGenerator.generate(g)在if()条件中。方法mazeGenerator.generate(g)递归绘制随机迷宫。这就是为什么我不想多次运行这个方法

到目前为止,一切看起来都很好。但是,当我运行主JFrame并单击JButton时,maze不会在mazePanel中渲染。有时,当我最小化和最大化JFrame时,会呈现迷宫(可能是因为发生了repaint()。即使我在if()条件中注释mazeGenerator.generate(g)并放置一些g.drawString()。执行操作(即按下JButton)时,不会呈现字符串

问题在哪里?请帮忙


谢谢。

因此基本上您有一个不包含任何内容的
JPanel
,您调用一个未知的Swing方法,并期望在更改私有字段的状态时神奇地调用
paintComponent
方法

您已经发现,由于重新绘制,最小化和最大化再次解决了您的问题。这应该是足够的信息,当你按下按钮时,你必须自己触发重新绘制

如果你按照@kleopatra的建议去做的话

更改状态,然后触发重新验证/喷漆


您应该已经解决了您的问题

,因此基本上您有一个不包含任何内容的
JPanel
,您调用一个未知的Swing方法,并期望在更改私有字段的状态时神奇地调用
paintComponent
方法

您已经发现,由于重新绘制,最小化和最大化再次解决了您的问题。这应该是足够的信息,当你按下按钮时,你必须自己触发重新绘制

如果你按照@kleopatra的建议去做的话

更改状态,然后触发重新验证/喷漆


您可能已经解决了问题

在绘制任何组件时,请不要更改其状态。相反,改变状态,然后在addNewMazeHi kleopatra中触发重新验证/喷漆。谢谢你的友好回复。如果你能给我解释一下就最好了。不知道有什么需要解释的,除了“将maze.generate()从paintComponent移动到其他方法,f.i.进入addNewMaze”之外,在绘制任何组件时,永远不要更改任何组件的状态。相反,改变状态,然后在addNewMazeHi kleopatra中触发重新验证/喷漆。谢谢你的友好回复。如果你能给我解释一下就最好了。除了“将maze.generate()从paintComponent移动到其他方法,f.i.进入addNewMaze”之外,不知道还有什么需要解释的