Java 在全屏和窗口模式之间切换失败

Java 在全屏和窗口模式之间切换失败,java,swing,drawing,jframe,fullscreen,Java,Swing,Drawing,Jframe,Fullscreen,我正在开发一个受XNA启发的游戏框架。几乎每天我都会发现这个或那个的新问题。今天,它将从窗口模式切换到全屏模式,然后再切换回来。其要点是: 如果我在窗口模式下启动游戏,它可以正常工作。当我全屏拍摄时,效果也很好。从全屏切换回来后,出现了一些问题,屏幕上没有绘制任何内容。再次全屏显示效果很好。我只是在窗口模式下遇到这个问题,除非游戏是在窗口模式下启动的 我这样设置窗口: public void setW(){ jFrame.setVisible(false); if(graphic

我正在开发一个受XNA启发的游戏框架。几乎每天我都会发现这个或那个的新问题。今天,它将从窗口模式切换到全屏模式,然后再切换回来。其要点是:

如果我在窗口模式下启动游戏,它可以正常工作。当我全屏拍摄时,效果也很好。从全屏切换回来后,出现了一些问题,屏幕上没有绘制任何内容。再次全屏显示效果很好。我只是在窗口模式下遇到这个问题,除非游戏是在窗口模式下启动的

我这样设置窗口:

public void setW(){
    jFrame.setVisible(false);
    if(graphicDevice.getFullScreenWindow() != null && jFrame.isDisplayable())graphicDevice.getFullScreenWindow().dispose();
    graphicDevice.setFullScreenWindow(null);
    jFrame.setResizable(false);
    jFrame.setUndecorated(false);               
    jFrame.getContentPane().setPreferredSize(new Dimension(width, height)); 
    jFrame.setVisible(true);        
    jFrame.pack();          
    graphics = (Graphics2D)jFrame.getContentPane().getGraphics();       
    fullScreen = false;
}   
全屏设置如下

public void setFS(){
    jFrame.setVisible(false);
    if(jFrame.isDisplayable())jFrame.dispose();     
    jFrame.setResizable(false);
    jFrame.setUndecorated(true);
    graphicDevice.setFullScreenWindow(jFrame);      
    graphicDevice.setDisplayMode(new DisplayMode(width, height, 32, 60));
    graphics = (Graphics2D)jFrame.getContentPane().getGraphics(); // graphicDevice.getFullScreenWindow().getGraphics(); does the same thing
    fullScreen = true;          
}
然后我用这个方法画。。。deviceManager.getGraphics().draw…(实际上我使用了一个中间缓冲区图像)我使用了一个游戏循环,所以这种情况会持续发生

public Graphics2D getGraphics(){
return graphics;
}
现在如果我使用这个方法:

public Graphics2D getGraphics(){
if(fullScreen)
return (Graphics2D)graphics;
else
return (Graphics2D)jFrame.getContentPane().getGraphics();
}
我肯定我做错了什么。窗口模式工作,我知道。为什么当我从全屏返回时它会变成梨形。窗户一直是灰色的,上面什么也没画

但是,如果我创建这样的方法:

public void assignGraphics(){
graphics = (Graphics2D)jFrame.getContentPane().getGraphics()
} 
稍后再调用它(一个游戏周期过去了),它解决了问题。这就是为什么第二种模式切换方法有效,因为它每个周期都从JFrame获取图形


自从开始这个问题以来,我对这个问题做了很多工作,这里的问题是真正的症结所在:为什么我不能在离开全屏的同一周期内获得窗口的图形?

EDT。为什么问题总是在我不注意的地方。是的,问题是我的游戏循环是基于swing.timer的。这是一个新手犯的错误,事实上,我花了将近一周的时间才弄明白,这沉重地打击了我的自尊心

显然,许多swing操作都是在EDT上进行的,使用EDT进行更新和绘图不仅堵塞了吸盘,而且导致了这个问题

现在,我将在主线程中使用while()进行可变时间步长循环。(即使使用只包含update()和draw()的基本while循环,问题也解决了)

在开始我的程序之前,至少应该阅读一篇关于游戏循环的文章。生活和学习(浪费一个星期的时间被难倒)