当前位置: 首页 > 工具软件 > JOGL > 使用案例 >

使用JavaSwing代码创建绘图表面(JOGL)

章玮
2023-12-01

使用JavaSwing代码创建绘图表面

这个启动程序的目的是运行打开窗口和创建绘图表面所需的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();
  }
}
 类似资料: