这个启动程序的目的是运行打开窗口和创建绘图表面所需的JavaSwing代码。程序清单打开一个窗口并附加一个OpenGL画布和事件监听器。在这个阶段,画布区域上没有绘制任何内容。但是,该程序可用于检查您是否已为JOGL设置了相关的系统编程环境路径,从而进行程序编译。我们将使用此程序来解释与设置窗口相关的一些内务处理——此代码将出现在您未来的许多程序中。
2.1.1导入Java包
首先,需要导入许多包。这些程序可以访问OpenGL API以及用于创建窗口和检测该窗口上的事件的标准Java例程(例如,窗口关闭事件,例如,在Microsoft Windows中,通过单击窗口标题栏右端的叉来触发)。如果您不知道如何使用JavaAWT和JavaSwing,那么您需要进行一些背景阅读,因为我将重点介绍OpenGL方面。现在,您可以在每个程序中重用相同的代码。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.FPSAnimator;
public class A01 extends JFrame {
// ...
}
我在import语句中单独列出了各个类。另一种方法是使用java.awt.*和java.awt.event.*和com.jogamp.opengl.*和com.jogamp.opengl.util.*使用通配符.*意味着编译器将根据该文件中的其余程序代码决定需要导入哪些类。
为了创建窗口,我们使用JavaSwing的JFrame类。主类A01扩展了JFrame类,因此在调用构造函数时继承了创建框架的代码
public class A01 extends JFrame {
private static final int WIDTH = 1024;
private static final int HEIGHT = 768;
private static final Dimension dimension = new Dimension(WIDTH, HEIGHT);
private GLCanvas canvas;
private GLEventListener glEventListener;
private final FPSAnimator animator;
public static void main(String[] args) {
A01 f = new A01("A01");
f.getContentPane().setPreferredSize(dimension);
f.pack();
f.setVisible(true);
}
public A01(String textForTitleBar) {
// ...
}
A01类中声明了许多私有属性。一个静态属性是将创建的窗口的维度。一个是将要绘制的画布。第三个是动画师,将用于创建显示循环,即每秒执行n次的循环,以显示需要绘制的内容(详见下文)。glEventListener将在后面解释。类的主入口点创建A01类的实例(即框架),设置其大小,使用pack确保框架的所有内容都在其首选大小或以上,然后使框架可见。
程序清单中给出了A01构造函数。它设置了某些参数,并将小部件和监听器添加到框架(即窗口)中。第2行使用超类设置标题栏中显示的文本。在考虑剩余的行之前,请阅读OpenGL配置文件上突出显示的框中的文本。
总之,所有的代码都应该是这样的:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.FPSAnimator;
public class A01 extends JFrame {
private static final int WIDTH = 1024;
private static final int HEIGHT = 768;
private static final Dimension dimension = new Dimension(WIDTH, HEIGHT);
private GLCanvas canvas;
private GLEventListener glEventListener;
private final FPSAnimator animator;
public static void main(String[] args) {
A01 f = new A01("A01");
f.getContentPane().setPreferredSize(dimension);
f.pack();
f.setVisible(true);
}
public A01(String textForTitleBar) {
super(textForTitleBar);
GLCapabilities glcapabilities = new GLCapabilities(GLProfile.get(GLProfile.GL3));
canvas = new GLCanvas(glcapabilities);
glEventListener = new A01_GLEventListener();
canvas.addGLEventListener(glEventListener);
getContentPane().add(canvas, BorderLayout.CENTER);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
animator.stop();
remove(canvas);
dispose();
System.exit(0);
}
});
animator = new FPSAnimator(canvas, 60);
animator.start();
}
}