我正在尝试使用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
}
有没有人有任何想法,可能是什么原因造成这种情况?
我无法重现这个问题,但是......除了已经给出的答案之外,还有一个疯狂的猜测:在将画布添加到内容窗格之前尝试添加另一个this.pack()调用** 。 (这将“实现”框架,并应分配所有内部资源 - 也就是似乎为空的“comp”)。 – Marco13
@ Marco13:谢谢!这导致我发现问题。我设置了一个NPE断点。显然,代码会抛出一个NPE,然后捕获并忽略它。我很困惑,因为如果你忽略NPE,我发布的代码仍然没有任何作用。但是,我发现如果我添加“canvas.setBounds(new Rectangle(0,0,640,480));”创建画布后的任何地方,事情开始工作。我不确定为什么这是必要的,或者为什么没有教程提到它,但这已经为我解决了一些问题。谢谢! – TrespassersW
这实际上可能与尺寸为(0,0)的画布变得可见或如此(任何)相关。你是否也尝试了答案中的建议? – Marco13