jogl:在SWT中使用OpenGL的模板(SWT_AWT桥接)

/*******************************************************************************
 * Copyright (c) 2015, 2015  Technologies Corporation.
 ******************************************************************************/
package test.muban;

import java.awt.FlowLayout;
import java.awt.Frame;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
import javax.swing.SwingUtilities;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import com.sun.opengl.util.FPSAnimator;

public class BasicFrame implements GLEventListener {

	static Display display;

	static Shell shell;

	static FPSAnimator animator;

	public Frame creatSWT() {
		display = Display.getDefault();
		shell = new Shell();
		shell.setSize(550, 550);
		shell.setText("SWT_OpenGL");
		shell.setLayout(null);
		final Composite compSWT = new Composite(shell, SWT.EMBEDDED);// SWT.EMBEDDED必须
		compSWT.setSize(500, 500);
		compSWT.setLocation(0, 0);
		final java.awt.Frame frame = SWT_AWT.new_Frame(compSWT);
		frame.setLayout(new FlowLayout());
		shell.layout();
		shell.open();
		return frame;
	}

	public static void main(final String[] args) {

		final GLCapabilities capabilities = new GLCapabilities();
		final GLCanvas glcanvas = new GLCanvas(capabilities);// 创建画布
		final BasicFrame basicFrame = new BasicFrame();
		glcanvas.addGLEventListener(basicFrame);// basicFrame重写了GLEventListener的画图的方法
		glcanvas.setSize(500, 500);
		animator = new FPSAnimator(glcanvas, 10, true);

		final Frame frame = basicFrame.creatSWT();
		frame.add(glcanvas);// 把画布放进 窗口内

		SwingUtilities.invokeLater(

		new Runnable() {

			@Override
			public void run() {

				animator.start(); // 开始动画线程

			}

		}

		);

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		animator.stop();
		display.dispose();
	}

	@Override
	public void init(final GLAutoDrawable drawable) { // 初始函数

		final GL gl = drawable.getGL();
		final GLU glu = new GLU();
		gl.glClearColor(0.0f, 0.0f, 250.0f, 1f); // 设置背景颜色
		gl.glViewport(0, 0, 100, 100); // 视点大小
		gl.glMatrixMode(GL.GL_PROJECTION);
		gl.glLoadIdentity();
		// 裁剪横坐标(left,right)纵坐标(bottom,top)范围内的视图,放进GL可见视图中
		glu.gluOrtho2D(0.0, 100, 0.0, 100.0); // 使坐标系统出现在GL里,此时屏幕中最左面是坐标0,右面是500,最下0,嘴上500

	}

	@Override
	public void display(final GLAutoDrawable drawable) { // 画图函数

		final GL gl = drawable.getGL(); // 从GLAutoDrawable获取GL
		gl.glClear(GL.GL_COLOR_BUFFER_BIT); // 填充背景颜色
		gl.glColor3f(250.0f, 0.0f, 0.0f); // 设置GL的画图颜色,也就是画刷的颜色

		gl.glBegin(GL.GL_LINES);

		gl.glVertex2d(5, 5);
		gl.glVertex2d(95, 5);
		gl.glVertex2d(5, 95);
		gl.glVertex2d(95, 95);
		gl.glVertex2d(5, 50);
		gl.glVertex2d(95, 50);
		gl.glVertex2d(50, 5);
		gl.glVertex2d(50, 95);

		gl.glEnd();
		gl.glFlush();

		System.out.println("1");

	}

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

	}

	@Override
	public void displayChanged(final GLAutoDrawable drawable, final boolean modeChanged, final boolean deviceChanged) {

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Swing 是一个基于 Java 的图形用户界面(GUI)工具包,主要用于开发桌面应用程序。而 OpenGL 是一个跨平台的 3D 图形库,通常用于游戏开发和科学可视化等领域。 虽然 Java Swing 自带一些绘图功能,但是如果需要实现复杂的 3D 图形渲染效果,还是需要使用 OpenGL 这样的专业图形库。在 Java Swing 使用 OpenGL 可以通过 JOGL(Java OpenGL)库来实现。 以下是使用 JOGL 实现在 Java Swing 使用 OpenGL 渲染的基本步骤: 1. 引入 JOGL 库:在项目引入 JOGL 库,可以通过 Maven 或手动下载并添加到项目来。 2. 创建 OpenGL 帧缓冲区:在 Java Swing 创建一个 JPanel,用于在其显示 OpenGL 渲染的图像。在 JPanel 创建一个 GLJPanel,作为 OpenGL 帧缓冲区。 3. 实现 OpenGL 渲染器:创建一个实现 GLEventListener 接口的类,用于实现 OpenGL 渲染器。在其实现 OpenGL 渲染所需的初始化、绘制等方法。 4. 在 JPanel 添加 GLJPanel:将 GLJPanel 添加到 JPanel ,以便在其进行 OpenGL 渲染。 下面是一个简单的示例代码,演示如何在 Java Swing 使用 JOGL 库实现 OpenGL 渲染: ```java import javax.swing.JFrame; import javax.swing.JPanel; import com.jogamp.opengl.GL; import com.jogamp.opengl.GLAutoDrawable; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.GLEventListener; import com.jogamp.opengl.awt.GLJPanel; public class OpenGLDemo extends JPanel implements GLEventListener { private static final long serialVersionUID = 1L; private GLJPanel panel; public OpenGLDemo() { // 创建 OpenGL 帧缓冲区 GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL2)); panel = new GLJPanel(caps); panel.addGLEventListener(this); // 将 GLJPanel 添加到 JPanel add(panel); } @Override public void init(GLAutoDrawable drawable) { // 初始化 OpenGL 渲染器 GL gl = drawable.getGL(); gl.glClearColor(1f, 1f, 1f, 1f); } @Override public void display(GLAutoDrawable drawable) { // 实现 OpenGL 渲染 GL gl = drawable.getGL(); gl.glClear(GL.GL_COLOR_BUFFER_BIT); gl.glBegin(GL.GL_TRIANGLES); gl.glColor3f(1f, 0f, 0f); gl.glVertex2f(-1f, -1f); gl.glColor3f(0f, 1f, 0f); gl.glVertex2f(0f, 1f); gl.glColor3f(0f, 0f, 1f); gl.glVertex2f(1f, -1f); gl.glEnd(); } @Override public void dispose(GLAutoDrawable drawable) { // 释放 OpenGL 资源 } @Override public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { // 重新设置 OpenGL 视口 GL gl = drawable.getGL(); gl.glViewport(0, 0, width, height); } public static void main(String[] args) { JFrame frame = new JFrame("OpenGL Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 300); frame.setLocationRelativeTo(null); // 添加 OpenGLDemo 到 JFrame OpenGLDemo demo = new OpenGLDemo(); frame.add(demo); frame.setVisible(true); } } ``` 这个示例代码创建了一个 JFrame,其包含一个 JPanel,在其使用 JOGL 库创建了一个 GLJPanel 作为 OpenGL 帧缓冲区。在 GLEventListener 实现了初始化、绘制等方法,并将 GLJPanel 添加到 JPanel 。最后将 JPanel 添加到了 JFrame 并显示出来。 运行这个程序,就可以看到一个简单的 OpenGL 渲染效果。这个示例只是一个简单的演示,实际上使用 JOGL 库实现更复杂的 OpenGL 渲染还需要更多的代码和技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值