Eclipse下的SWT的OpenGL开发(配置、实例及源码)正弦波

2023-12-14 17:48

本文主要是介绍Eclipse下的SWT的OpenGL开发(配置、实例及源码)正弦波,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面两个博文都是用java的awt开发jogl,但是现在想用swt开发,配置就不行了;

查了很多,说要eclipse安装OpenGL插件才可以,也下载了,解压到了plugin文件夹内,但是添加依赖时候死活找不到OpenGL插件,也就import不到GL、GLU两个类,只有放弃了(如果你能够正常添加OpenGL依赖请在下面留言告诉大家方法)。(发现一个新的解决方法:Eclipse--File--import--Plug-ins and Fragments--Directory--选择解压得到的文件夹--把两个文件夹add过来--finish,这样插件依赖的时候可以找到插件org.eclipse.opengl)

没办法,我暂且这样做的:把解压插件得到的两个文件夹中的org.eclipse.opengl_0.5.0文件夹里的ogl.jar文件,直接复制到项目工程中新建文件夹lib中,然后右键build path,这样也可以运行,虽然这不是插件应该依赖的方式。。。。。。。。。。。。。。另外还需要把org.eclipse.opengl.win32.x86_0.5.0文件夹里的gl-0500.dll文件复制到C盘windows/system32下面(其实放在PATH环境变量里面的任一个文件夹下都是可以的:如jdk的bin文件夹里也可以)

实例源码

新建一个插件工程:这是一个画正弦波和余弦的代码,能够调节频率

1、建一个类Point

package swt.opengl.sin;public class Point {private double pointX;private double pointY;public Point(double x, double y) {pointX = x;pointY = y;}public double getPointX() {return pointX;}/*public void setPointX(double pointX) {this.pointX = pointX;}*/public double getPointY() {return pointY;}/*public void setPointY(double pointY) {this.pointY = pointY;}*/}


2、建一个类PointVector

package swt.opengl.sin;import java.util.Vector;public class PointVector {private static Vector<Point>  points = new Vector<Point>();public static Vector<Point> getPoints() {return points;}public static void addPoint(Point point) {points.add(point);}public static Point getPoint(int i) {Point point = points.get(i);return point;}
}


3、建一个类Curve2

package swt.opengl.sin;import java.util.Vector;import org.eclipse.opengl.GL;
import org.eclipse.opengl.GLU;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.opengl.GLCanvas;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;public class Curve2 {private GLCanvas canvas;private Composite composite;private ToolBar toolBar;private Composite controlComposite;private ToolItem frequencyToolItem;private Menu frequencyMenu;private ViewForm viewForm;private Shell shell;private static double d = Math.PI * 0;private Text frequency;private String wave = "sin";private int sleep = 100;private Image image;static Display display;public Curve2(final Shell sh) {shell = sh;initShell();canvas.setCurrent();setupViewingArea();init();createControl(controlComposite);final Runnable timer = new Runnable() {@Overridepublic void run() {if (shell.isDisposed()) {image.dispose();return;}draw();frequency.setText(String.valueOf(sleep));shell.getDisplay().timerExec(sleep, this);}};timer.run();canvas.addMouseListener(new MouseAdapter() {@Overridepublic void mouseDown(final MouseEvent e) {System.out.println(e.x + "   " + e.y);}});}private void initShell() {viewForm = new ViewForm(shell, SWT.NONE);viewForm.setLayout(new FillLayout());composite = new Composite(viewForm, SWT.NONE);viewForm.setContent(composite);initToolBar();viewForm.setTopLeft(toolBar);composite.setLayout(new GridLayout(2, false));GridData gridData = new GridData();gridData.heightHint = 400;gridData.widthHint = 400;gridData.verticalAlignment = GridData.BEGINNING;final GLData glData = new GLData();glData.doubleBuffer = true;glData.stencilSize = 8;canvas = new GLCanvas(composite, SWT.NONE, glData);canvas.setLayout(new GridLayout());canvas.setLayoutData(gridData);canvas.setSize(400, 400);gridData = new GridData();gridData.verticalAlignment = GridData.BEGINNING;controlComposite = new Composite(composite, SWT.NONE);controlComposite.setLayout(new GridLayout());controlComposite.setLayoutData(gridData);initMenu();}private void initMenu() {final Menu menu = new Menu(shell, SWT.BAR);final MenuItem file = new MenuItem(menu, SWT.CASCADE);file.setText("文件");final Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);final MenuItem exit = new MenuItem(fileMenu, SWT.PUSH);exit.setText("退出(&E)");exit.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {shell.dispose();}});file.setMenu(fileMenu);final MenuItem undee = new MenuItem(menu, SWT.CASCADE);undee.setText("波形");final Menu undeeMenu = new Menu(shell, SWT.DROP_DOWN);final MenuItem itemSin = new MenuItem(undeeMenu, SWT.RADIO);itemSin.setText("正弦波");itemSin.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {wave = "sin";}});final MenuItem itemCos = new MenuItem(undeeMenu, SWT.RADIO);itemCos.setText("余弦波");itemCos.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {wave = "cos";}});final MenuItem itemElse = new MenuItem(undeeMenu, SWT.RADIO);itemElse.setText("三角波");itemElse.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {wave = "else";}});undee.setMenu(undeeMenu);final MenuItem frequencyItem = new MenuItem(menu, SWT.CASCADE);frequencyItem.setText("频率");final Menu frequencyMenu = new Menu(shell, SWT.DROP_DOWN);final MenuItem itemMs1000 = new MenuItem(frequencyMenu, SWT.RADIO);itemMs1000.setText("1000 ms");addListenerCode(itemMs1000, 1000);final MenuItem itemMs200 = new MenuItem(frequencyMenu, SWT.RADIO);itemMs200.setText("200 ms");addListenerCode(itemMs200, 200);final MenuItem itemMs100 = new MenuItem(frequencyMenu, SWT.RADIO);itemMs100.setText("100 ms");addListenerCode(itemMs100, 100);final MenuItem itemMs50 = new MenuItem(frequencyMenu, SWT.RADIO);itemMs50.setText("50 ms");addListenerCode(itemMs50, 50);final MenuItem itemMs30 = new MenuItem(frequencyMenu, SWT.RADIO);itemMs30.setText("30 ms");addListenerCode(itemMs30, 30);final MenuItem itemMs20 = new MenuItem(frequencyMenu, SWT.RADIO);itemMs20.setText("20 ms");addListenerCode(itemMs20, 20);frequencyItem.setMenu(frequencyMenu);shell.setMenuBar(menu);}private void initToolBar() {image = new Image(shell.getDisplay(), "icons/1.png");toolBar = new ToolBar(viewForm, SWT.SHADOW_OUT);final ToolItem checkTypeSin = new ToolItem(toolBar, SWT.RADIO);checkTypeSin.setText("正弦波");checkTypeSin.setToolTipText("正弦波曲线");checkTypeSin.setImage(image);checkTypeSin.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {wave = "sin";}});final ToolItem checkTypeCos = new ToolItem(toolBar, SWT.RADIO);checkTypeCos.setText("余弦波");checkTypeCos.setToolTipText("余弦波曲线");checkTypeCos.setImage(image);checkTypeCos.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {wave = "cos";}});final ToolItem checkTypeElse = new ToolItem(toolBar, SWT.RADIO);checkTypeElse.setText("三角波");checkTypeElse.setToolTipText("三角波曲线");checkTypeElse.setImage(image);checkTypeElse.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {wave = "else";}});final ToolItem sepa = new ToolItem(toolBar, SWT.SEPARATOR);frequencyToolItem = new ToolItem(toolBar, SWT.DROP_DOWN);frequencyToolItem.setText("频率");frequencyToolItem.setToolTipText("刷新频率");frequencyToolItem.setImage(image);frequencyMenu = new Menu(shell, SWT.POP_UP);final MenuItem ms1000 = new MenuItem(frequencyMenu, SWT.RADIO);ms1000.setText("1000 ms");addListenerCode(ms1000, 1000);final MenuItem ms200 = new MenuItem(frequencyMenu, SWT.RADIO);ms200.setText("200 ms");addListenerCode(ms200, 200);final MenuItem ms100 = new MenuItem(frequencyMenu, SWT.RADIO);ms100.setText("100 ms");addListenerCode(ms100, 100);final MenuItem ms50 = new MenuItem(frequencyMenu, SWT.RADIO);ms50.setText("50 ms");addListenerCode(ms50, 50);final MenuItem ms30 = new MenuItem(frequencyMenu, SWT.RADIO);ms30.setText("30 ms");addListenerCode(ms30, 30);final MenuItem ms20 = new MenuItem(frequencyMenu, SWT.RADIO);ms20.setText("20 ms");addListenerCode(ms20, 20);frequencyToolItem.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {if (e.detail == SWT.ARROW) {final Rectangle rect = frequencyToolItem.getBounds();Point point = new Point(rect.x, rect.y + rect.height);point = toolBar.toDisplay(point);frequencyMenu.setLocation(point);frequencyMenu.setVisible(true);}}});}private void addListenerCode(final MenuItem menuItem, final int sleepi) {menuItem.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {sleep = sleepi;frequency.setText(sleep + "");}});}private void createControl(final Composite composite) {final Composite objectGroup = new Composite(composite, SWT.NONE);final GridLayout layout = new GridLayout(3, false);layout.marginHeight = 0;layout.marginWidth = 0;objectGroup.setLayout(layout);objectGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));new Label(objectGroup, SWT.NONE).setText("波形:");final Combo objectCombo = new Combo(objectGroup, SWT.READ_ONLY);GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);data.grabExcessHorizontalSpace = true;data.horizontalSpan = 2;objectCombo.setLayoutData(data);objectCombo.setItems(new String[] { "正弦波	", "余弦波", "三角波" });objectCombo.setData("正弦波", "sin");objectCombo.setData("余弦波", "cos");objectCombo.setData("三角波", "else");objectCombo.select(0);objectCombo.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {final String type = objectCombo.getText();wave = (String) objectCombo.getData(type.trim());}});new Label(objectGroup, SWT.NONE).setText("刷新频率(ms):");frequency = new Text(objectGroup, SWT.BORDER);data = new GridData();data.widthHint = 30;frequency.setLayoutData(data);frequency.setText(sleep + "");frequency.addVerifyListener(new VerifyListener() {@Overridepublic void verifyText(final VerifyEvent e) {final String inStr = e.text;if (inStr.length() > 0) {e.doit = new String("0123456789").indexOf(inStr) >= 0;}}});final Button apply = new Button(objectGroup, SWT.NONE);apply.setText("应用");apply.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(final SelectionEvent e) {final String str = frequency.getText();sleep = new Integer(str).intValue();}});}private void init() {GL.glClear(GL.GL_COLOR_BUFFER_BIT);GL.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);canvas.swapBuffers();}private void makePoints() {d = d + Math.PI / 100;double sinX = Math.PI * 0;if (wave.equals("sin")) {for (int i = 0; i <= 10000; i++) {sinX += Math.PI / 1000;double x = sinX;final double y = 4 * Math.sin(sinX + d * Math.PI);x = 2 * sinX / Math.PI - 6;final swt.opengl.sin.Point point = new swt.opengl.sin.Point(x, y);PointVector.addPoint(point);}} else if (wave.equals("cos")) {for (int i = 0; i <= 10000; i++) {sinX += Math.PI / 1000;double x = sinX;final double y = 4 * Math.cos(sinX + d * Math.PI);x = 2 * sinX / Math.PI - 6;final swt.opengl.sin.Point point = new swt.opengl.sin.Point(x, y);swt.opengl.sin.PointVector.addPoint(point);}} else {}}private void setupViewingArea() {final Rectangle rect = canvas.getClientArea();final int height = rect.height;final int width = rect.width;GL.glViewport(0, 0, width, height);GL.glMatrixMode(GL.GL_PROJECTION);GL.glLoadIdentity();final float fAspect = (float) width / (float) height;GLU.gluPerspective(45.0f, fAspect, 0.5f, 400.0f);GL.glMatrixMode(GL.GL_MODELVIEW);GL.glLoadIdentity();}private void drawPoint(final swt.opengl.sin.Point point) {GL.glPushMatrix();GL.glBegin(GL.GL_POINTS);GL.glVertex2d(point.getPointX(), point.getPointY());GL.glEnd();GL.glPopMatrix();}public void draw() {GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);GL.glLoadIdentity();GL.glTranslatef(0.0f, 0.0f, -14.0f);GL.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);GL.glBegin(GL.GL_POINTS);makePoints();final Vector<swt.opengl.sin.Point> vp = PointVector.getPoints();for (int i = 0; i < vp.size(); i++) {drawPoint(vp.get(i));}vp.removeAllElements();GL.glEnd();canvas.swapBuffers();}/*** @param args*/public static void main(final String[] args) {// Display display = new Display();display = new Display();final Shell shell = new Shell(display);shell.setLayout(new FillLayout());final Curve2 curve = new Curve2(shell);shell.setText("曲线图");shell.pack();shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}display.dispose();}}


自己在工程中添加一个文件夹,然后放一张图片重命名就可以了。


这篇关于Eclipse下的SWT的OpenGL开发(配置、实例及源码)正弦波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/493452

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则