Swing 发生操作时,图形平面二维对象不会渲染
我正在设计一个秋千游戏。目前我正在为这个游戏设计迷宫。迷宫采用深度优先搜索算法生成。在我的主JFrame中,我有一些JPanel。一个名为mazePanel的JPanel包含迷宫。还有其他一些JPanel,其中包含用于控制的JButton。以下是mazePanel代码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
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”之外,不知道还有什么需要解释的