2015-11-24 63 views
0

我正在尝试使用NetBeans和Swing的一个非常简单的JOGL教程,它似乎不管我如何安排事情,我总是收到一个空指针异常。这里是我使用的代码(改编自教程):简单的JOGL测试用例中的NullPointerException

package testjogl; 

import com.jogamp.opengl.*; 
import com.jogamp.opengl.awt.GLCanvas; 
import java.awt.Dimension; 

public class OpenGLTest extends javax.swing.JFrame implements GLEventListener { 

    public OpenGLTest() { 
     initComponents();   
    } 

    public void doMain() { 
     GLCanvas canvas = new GLCanvas(); 
     canvas.addGLEventListener(this); 
     canvas.setPreferredSize(new Dimension(640, 480)); 
     this.getContentPane().add(canvas); // <--- This is where the exception happens 
     this.pack(); 
     this.setVisible(true); 
    } 

    @Override 
    public void init(GLAutoDrawable drawable) { 
     GL2 gl = drawable.getGL().getGL2();  
     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    } 

    @Override 
    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { } 

    @Override 
    public void display(GLAutoDrawable drawable) { 
     GL2 gl = drawable.getGL().getGL2(); 
     gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 
     gl.glLoadIdentity(); 
    } 

    @Override 
    public void dispose(GLAutoDrawable drawable) { } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 400, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 300, Short.MAX_VALUE) 
     ); 

     pack(); 
    }// </editor-fold>       

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new OpenGLTest().doMain(); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    // End of variables declaration     
} 

在那里我的画布添加到我的表格行,我得到:在阳光打 异常显示java.lang.NullPointerException(空)断点.awt.image.OffScreenImageSource由线程AWT-EventQueue-0执行。

我已经尝试了几个不同的JOGL教程,当我将画布添加到表单时,它们都保持抛出此异常。我找不到OffScreenImageSource的代码,但是当我逐步完成时,它在Container.java的第1119行中停止。代码是:

invalidateIfValid(); 
if (peer != null) { 
    comp.addNotify(); // <---- Dies right here 
} 

有没有人有任何想法,可能是什么原因造成这种情况?

+1

我无法重现这个问题,但是......除了已经给出的答案之外,还有一个疯狂的猜测:在将画布添加到内容窗格之前尝试添加另一个this.pack()调用** 。 (这将“实现”框架,并应分配所有内部资源 - 也就是似乎为空的“comp”)。 – Marco13

+0

@ Marco13:谢谢!这导致我发现问题。我设置了一个NPE断点。显然,代码会抛出一个NPE,然后捕获并忽略它。我很困惑,因为如果你忽略NPE,我发布的代码仍然没有任何作用。但是,我发现如果我添加“canvas.setBounds(new Rectangle(0,0,640,480));”创建画布后的任何地方,事情开始工作。我不确定为什么这是必要的,或者为什么没有教程提到它,但这已经为我解决了一些问题。谢谢! – TrespassersW

+0

这实际上可能与尺寸为(0,0)的画布变得可见或如此(任何)相关。你是否也尝试了答案中的建议? – Marco13

回答

1

你的问题是你没有给Swing足够的时间来使用OS GDI正确地初始化组件:只要你创建OpenGLTest()实例,就调用doMain()。给Swing一些呼吸,它应该工作。

public static void main(String args[]) { 
    OpenGLTest test; 
    java.awt.EventQueue.invokeLater(() -> { 
     test = new OpenGLTest() 
    }); 
    java.awt.EventQueue.invokeLater(() -> { 
     test.doMain(); 
    }); 
} 

仅供参考,我没有验证语法。

+0

我不得不重新安排代码以适应工作,但它没有帮助。实际上,即使在画框已经被显示之后(例如响应按钮点击),延迟创建画布也没有区别。谢谢你的建议,但我想我已经明白了。 – TrespassersW