Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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 Swing组件未重新绘制_Java_Swing_Opengl - Fatal编程技术网

Java Swing组件未重新绘制

Java Swing组件未重新绘制,java,swing,opengl,Java,Swing,Opengl,我在AWT画布中显示了一个LWJGL OpenGL显示屏,而AWT画布又位于Swing JPanel中,Swing JPanel用作Swing JFrame的内容窗格。在程序中的某个时刻,我想切换包含JComponent显示的AWT画布,这样就不用像这样: JFrame > JPanel > Canvas > Display 我有这样的想法: JFrame > JPanel > JComponent 但是,即使我从JPanel中删除画布并添加JComponent

我在AWT画布中显示了一个LWJGL OpenGL显示屏,而AWT画布又位于Swing JPanel中,Swing JPanel用作Swing JFrame的内容窗格。在程序中的某个时刻,我想切换包含JComponent显示的AWT画布,这样就不用像这样:

JFrame > JPanel > Canvas > Display
我有这样的想法:

JFrame > JPanel > JComponent
但是,即使我从JPanel中删除画布并添加JComponent,然后重新验证JPanel并重新绘制它,显示仍然会显示,直到我将CTRL-ALT-Supper设置为task manager(我的JFrame设置为Undecorated,ExtendedState为JFrame.EXTENDED_,所以它是全屏的)。此时,JComponent显示为从未发生过任何事情

我将分享我的代码中进行转换的部分,以便您可以帮助我指出我做错了什么:

public static void switchTo(Container container){
    pan.removeAll();
    container.setBounds(0, 0, Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
    pan.add(container);
    frame.getContentPane().validate();
    pan.revalidate();
    pan.repaint();
}
其中pan是我的JPanel,frame是我的JFrame

我还尝试直接将JComponent设置为JFrame的内容窗格,但结果完全相同

我唯一能让它正常工作的方法是事先在显示器上调用destroy();但是,我需要保持OpenGL上下文运行,这样我就不必重新初始化显示并在切换回显示时重新加载每个纹理,考虑到我拥有的纹理数量,这将是一个相当长的过程


非常感谢你的回答,我希望我说清楚了“我需要保持OpenGL上下文运行,以便在切换回显示时不必重新初始化显示并重新加载每个纹理,考虑到我拥有的纹理数量,这将是一个相当长的过程。”--这表明您可能有一段长时间运行的代码正在Swing事件线程上运行,从而阻止该线程执行其操作,包括更新显示。如果是这样,一个可能的解决方案是在后台线程中运行长时间运行的代码。不要将重量级AWT组件放在轻量级Swing组件中。不要在运行时关闭画布,而要避免将其放入。您几乎可以肯定地使用JPanel来代替它1)使用中所示的。2) 为了更快地获得更好的帮助,请发布or。@John Bollinger问题是,Display的setParent()方法只接受AWT画布。。。