Java Swing组件未重新绘制
我在AWT画布中显示了一个LWJGL OpenGL显示屏,而AWT画布又位于Swing JPanel中,Swing JPanel用作Swing JFrame的内容窗格。在程序中的某个时刻,我想切换包含JComponent显示的AWT画布,这样就不用像这样: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
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画布。。。