我在Swing中设计游戏。目前我正在设计这款游戏的迷宫。通过使用深度优先搜索算法生成迷宫。在我的主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后,应生成迷宫。即mazeGenerator.generate(g)在if()条件内。方法mazeGenerator.generate(g)递归绘制随机迷宫。这就是为什么我不想多次运行这个方法。
到目前为止一切都很好看。但是当我运行主JFrame并点击JButton时,迷宫不会在mazePanel中呈现。有时当我最小化并最大化JFrame时,迷宫呈现(可能是因为重绘()发生)。即使我在if()条件中注释mazeGenerator.generate(g)并放入一些g.drawString()。执行操作时不呈现字符串(即按JButton)。
问题出在哪里?请帮忙。
谢谢。
答案 0 :(得分:1)
所以基本上你有一个JPanel
什么都不包含,你调用Swing未知的方法,并且当你改变私有字段的状态时,期望paintComponent
方法被神奇地调用。
您已经发现最小化和最大化可以解决由于重新绘制而导致的问题。这应该足以让您知道在按下该按钮时必须自己触发重新绘制。
如果您按照@kleopatra的建议,我引用,
更改状态,然后触发重新验证/绘画
你已经解决了问题