Java 在JFrame重新绘制中调用特定JPanel的重新绘制也会调用JDialog
下面是我描述的一个小例子 嗯,我有一个简单的Java 在JFrame重新绘制中调用特定JPanel的重新绘制也会调用JDialog,java,swing,lwjgl,repaint,Java,Swing,Lwjgl,Repaint,下面是我描述的一个小例子 嗯,我有一个简单的JFrame,它的contentPane是JPanel,我用SwingWorker每隔20毫秒用panel.repaint()重新绘制一次 此外,我还打开了一个JDialog,它通过opengl显示自己的图形(我使用LWJGL库中的AWTGLCanvas),它可以在每次绘制内容时交换缓冲区和repaint()(快于20毫秒) 最大的问题是,在某种程度上,重新绘制我的JPanel也会影响JDialog,这意味着如果我删除面板。repaint()(我已经这
JFrame
,它的contentPane
是JPanel
,我用SwingWorker
每隔20毫秒用panel.repaint()
重新绘制一次
此外,我还打开了一个JDialog
,它通过opengl显示自己的图形(我使用LWJGL
库中的AWTGLCanvas
),它可以在每次绘制内容时交换缓冲区和repaint()
(快于20毫秒)
最大的问题是,在某种程度上,重新绘制我的JPanel
也会影响JDialog
,这意味着如果我删除面板。repaint()
(我已经这样做了),它可以正常工作!当我使用panel.repaint()
时,JDialog
会显示一些奇怪的线条,就像我将图形切成2段,并尝试将它们一起移动,但没有成功。我不知道他们是否称之为闪烁,但可能就是这个问题
public testFrame(){
panel = new JPanel(){
protected void paintComponent(Graphics g){
//do the painting for the JPanel here
}
}
setContentPane(panel);
updateTime();
}
public void updateTime(){
SwingWorker worker = new SWingWorker(){
@Override
protected Object doInBackground() throws Exception {
while(stopTimer == false){
Thread.sleep(20);
if(isFocused() == true){
timer += 0.2f;
panel.repaint();
}
}
return null;
}
};
worker.execute();
}
这是我的JDialog内容窗格中的AWTGLCanvas.paint
方法
@Override
public void paintGL() {
//do some painting with classic opengl
swapBuffers(); //awtglcanvas built-in method, meaning i cant control it
repaint(); // it actually runs paintGL() again
}
提前谢谢 可能是一个重/轻组件问题为了更快地获得更好的帮助,发布一个(最简单的完整和可验证的示例)。@PeGiannOS,尽管有一个。我会在显示窗口中使用LWJGL,而不是作为组件。您的JPanel是否创建了JDialog?你说相反的说法是不正确的,但那不是相关的。如果JDialog是JPanel的子级,那么在JPanel上调用repaint()
也会在JDialog上调用它。如果您不想这样做,您可能会覆盖JPanel中的paint()
,不调用super.paint()
,但这会导致它不会自动重新绘制由该JPanel创建的任何轻量级组件(源代码:),所以请确保这是您想要的…@PeGiannOS另一件事-在您的paintGL()中,您调用repaint(),正如您所说,再次调用paintGL()。因此,您的计时器根本不工作,它只是以尽可能快的速度运行paintGL(),并且您不时干扰SwingWorker,后者调用repaint()。也许从paintGL()中删除repaint()会有所帮助?