Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';在游戏循环中,不要拉入JPanel_Java_Swing_Jpanel - Fatal编程技术网

Java Can';在游戏循环中,不要拉入JPanel

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

我试图在一个地图面板上绘制,它在游戏循环期间扩展了JPanel,但失败了。但是,如果我在循环外部执行此操作,它将成功绘制。这是我的相关代码:

MenuPanel.java:

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并作为线程启动。