Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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 在JFrame重新绘制中调用特定JPanel的重新绘制也会调用JDialog_Java_Swing_Lwjgl_Repaint - Fatal编程技术网

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()会有所帮助?