Java Can';在游戏循环中,不要拉入JPanel
我试图在一个地图面板上绘制,它在游戏循环期间扩展了JPanel,但失败了。但是,如果我在循环外部执行此操作,它将成功绘制。这是我的相关代码: MenuPanel.java:Java Can';在游戏循环中,不要拉入JPanel,java,swing,jpanel,Java,Swing,Jpanel,我试图在一个地图面板上绘制,它在游戏循环期间扩展了JPanel,但失败了。但是,如果我在循环外部执行此操作,它将成功绘制。这是我的相关代码: MenuPanel.java: public void actionPerformed(ActionEvent e) { JButton pushedButton =(JButton) e.getSource(); if(pushedButton == play) guiManager.setGamePanelVisib
public void actionPerformed(ActionEvent e) {
JButton pushedButton =(JButton) e.getSource();
if(pushedButton == play)
guiManager.setGamePanelVisible(true);
else if(pushedButton == settings)
guiManager.setSettingsPanelVisible();
else if(pushedButton == credits)
guiManager.setCreditsPanelVisible();
else if(pushedButton == highScores)
guiManager.setHighScoresPanelVisible();
else if(pushedButton == help)
guiManager.setHelpPanelVisible();
}
GUIManager.java:
...
public void setGamePanelVisible(boolean gameStarted){
GamePanel gp = new GamePanel(this);
setContentPane(gp);
gp.initiate();
}
...
GamePanel.java
public void initiate(){
this.gm = new GameManager(this); // constructs the game manager and triggers the game loop
}
GameManager.java
public GameManager(GamePanel gp) {
this.gp = gp;
this.run();
}
private void run(){
while(running){
draw();
try{
sleep(1000);
} catch (InterruptedException e) {
System.out.println("Interrupted at GameManager.java");
}
}
我的预测是,游戏循环在MenuPanel仍然可见时开始(在setGamePanelVisible方法中),并且由于MenuPanel从未离开该方法,因此MenuPanel保持可见,从而导致这种情况。然而,我可能错了。即使是问题,我也想不出任何解决办法。也许我应该将按钮侦听器移动到另一个类?提前谢谢你 您正在阻止事件调度线程,这将阻止UI更新。除其他事项外,EDT负责处理重新喷漆请求。您的游戏循环正在EDT上下文中运行
actionPerformed
在EDT内执行,EDT调用setGamePanelVisible
,调用GameManager
,调用run
,阻止
请查看以了解更多详细信息
Swing不是线程安全的,因此您不能简单地启动一个新的线程
,并希望它能解决所有问题,您需要确保对UI的所有更新(包括UI可能需要的信息更新)都是在EDT上下文中进行的
一个更简单的解决方案是只使用Swing
计时器,这将允许您计划在EDT上下文中执行的定期定时更新。有关更多详细信息,请参见游戏循环的位置/内容?它叫什么名字?它听起来像是阻塞了事件调度线程,但这只是猜测。考虑提供一个演示你的问题的。这将减少混乱,提高效率responses@MadProgrammer删除了不相关的代码并添加了一些。我想这就是我要解释的。是的,阻止事件调度线程你的GameManager类ha实现Runnable并作为线程启动。