`
xuxiaolei
  • 浏览: 150206 次
  • 性别: Icon_minigender_1
  • 来自: 彩虹之巅
社区版块
存档分类

SWT中使用Opengl画圆的例子

阅读更多
import org.eclipse.opengl.GL;
import org.eclipse.opengl.GLU;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.opengl.GLCanvas;

public class MouseHandler implements MouseListener, MouseMoveListener {
	
	private boolean isMouseDown; //鼠标是否按下
	private Point beginPoint;
	private Point endPoint;
	
	private double degtorads = 3.14159265 / 180.0;
	
	private Window window;
	
	public MouseHandler(Window window) {
		this.window = window;
	}
	
	public void mouseDoubleClick(MouseEvent e) {
		//Nothing to do
	}
	
	public void mouseDown(MouseEvent e) {
		if(e.button == 1) {
			isMouseDown = true;
			beginPoint = screenToMode( new Point(e.x, e.y) );
		}
	}
	
	public void mouseUp(MouseEvent e) {
		isMouseDown = false;
	}
	
	public void mouseMove(MouseEvent e) {
		
		if(isMouseDown) {
			
			GLCanvas canvas = window.canvas;
			endPoint = screenToMode( new Point(e.x, e.y) );
			
			GL.glClear(GL.GL_COLOR_BUFFER_BIT);
			GL.glBegin(GL.GL_LINE_STRIP);
					
			double r = Math.sqrt((endPoint.x - beginPoint.x) * (endPoint.x - beginPoint.x) +
					(endPoint.y - beginPoint.y) * (endPoint.y - beginPoint.y));
			
			for(float theta = 0.0f; theta <= 360; theta += 1.0) {
				GL.glVertex2d(beginPoint.x + r * Math.cos(theta * degtorads), 
						beginPoint.y + r * Math.sin(theta * degtorads));
			}
	
			GL.glEnd();
		
			canvas.swapBuffers();
		}
	}
	
	public Point screenToMode(Point point) {
		Rectangle rect = window.canvas.getClientArea();
		return new Point(point.x - rect.width / 2, (rect.height - point.y) - rect.height / 2);
	}
}
 
import org.eclipse.opengl.GL;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.opengl.GLCanvas;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;


public class Window {
	
	private static Window instance = null;
	
	public Display display;
	public Shell shell;
	public GLCanvas canvas;

	private Window() {
		display = new Display();
		shell = new Shell(display);
		
		createContents(shell);
	}
	
	public void createContents(Composite composite) {
		composite.setLayout(new FillLayout());
		GLData data = new GLData();
		data.doubleBuffer = true;
		canvas = new GLCanvas(composite, SWT.NONE, data);
		canvas.setCurrent();
		
		canvas.addPaintListener(new PaintListener() {
			public void paintControl(PaintEvent e) {
				update();
			}
		}); 
		
		canvas.addControlListener(new ControlAdapter() {
			public void controlResized(ControlEvent e) {
				update();
			}
		});
		
		MouseHandler mh = new MouseHandler(this);
		canvas.addMouseListener(mh);
		canvas.addMouseMoveListener(mh);
		
	}
	
	public void mainLoop() {
		while(!shell.isDisposed()) {
			if(!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}
	
	public void dispose() {
		display.dispose();
	}
	
	public void show() {
		shell.open();
		
		mainLoop();
		dispose();
	}
	
	public void update() {
		Rectangle rect = canvas.getClientArea();
		
		GL.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
		GL.glColor3f(0.0f, 0.0f, 1.0f);
		GL.glMatrixMode(GL.GL_PROJECTION);
		GL.glLoadIdentity();
		
		GL.glOrtho(-rect.width / 2, rect.width / 2, -rect.height / 2, rect.height / 2, -1.0, 1.0);
		GL.glViewport(0, 0, rect.width, rect.height);
		
		GL.glClear(GL.GL_COLOR_BUFFER_BIT);
		
		canvas.swapBuffers();
	}
	
	public static Window getInstance() {
		if(instance == null) {
			instance = new Window();
		}
		
		return instance;
	}
}
 
public class Test {

	public static void main(String[] args) {
		Window window = Window.getInstance();
		window.show();
	}
}

 上面的程序是用鼠标画圆的例子,

3
4
分享到:
评论
3 楼 leftwing 2011-11-04  
chenleijiangjun 写道
太强啦!能画扇形吗?用world wind更好!谢谢!

扇形肯定没问题啊 把循环的角度上下限改一下就好了
比如我设定vertex的时候,是考虑x、y、z三轴的,所以数组大小事1080,那么循环的时候,比如从270到length-540,就能出来个直角的扇形啦
2 楼 leftwing 2011-11-04  
很好 es貌似只能用三角形来画圆了 唉
1 楼 chenleijiangjun 2009-03-25  
太强啦!能画扇形吗?用world wind更好!谢谢!

相关推荐

    SWT examples,SWT官方例子

    SWT examples,SWT官方例子:http://www.eclipse.org/swt/examples.php 该页面所要下载的例子 其中,swt的例子在\plugins\org.eclipse.swt.examples.source_3.7.0.v3740f.jar中

    基于SWT和Hibernate的应用例子

    在这个应用例子中,前端使用SWT来创建用户界面,用户可以通过这个界面进行各种操作。而后端,也就是非用户可见的部分,使用Hibernate来进行数据库操作。这样的设计模式分离了用户界面和业务逻辑,使得代码更易于维护...

    多个SWT例子

    在"swt_demo"中,可能包含了使用SWT实现的各种组件实例。 2. JFace: JFace 是构建在 SWT 之上的高级库,旨在简化GUI开发,提供数据绑定、事件处理、视图和编辑器框架等功能。它通过减少代码量和增加代码的可读性...

    SWT使用例子

    在"SWT使用例子"这个主题中,我们涵盖了多个核心组件和布局管理器的用法,这些都是构建SWT应用的基本元素。下面将逐一详细解释这些知识点: 1. **Button**: Button是GUI中最基础的元素之一,用于表示用户可以进行的...

    SWT Tree 完整的树例子源码

    在SWT中,Tree组件用于展示层次结构的数据,类似于Windows资源管理器中的文件系统视图。本教程将通过一个完整的SWT Tree实例,帮助新手理解如何创建、操作和自定义SWT Tree。 首先,我们来分析给定的文件列表: 1....

    Java桌面程序SWT记事本小例子

    在本示例中,我们关注的是使用SWT(Standard Widget Toolkit)库来创建一个简单的记事本应用。SWT是Java的一个开源GUI库,它为开发者提供了与操作系统更紧密集成的图形用户界面组件。下面,我们将深入探讨SWT、...

    如何在SWT中使用AWT、SWING组件

    在Java编程环境中,SWT(Standard Widget Toolkit)和AWT...总的来说,虽然SWT是Eclipse的主要GUI库,但通过桥接类,我们可以灵活地在SWT环境中使用AWT和SWING组件,以利用它们各自的优势来构建更丰富的用户界面。

    swt创建tree的例子

    在Java项目中使用SWT,首先需要引入SWT库。如果你使用的是Maven项目,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.eclipse.swt &lt;artifactId&gt;org.eclipse.swt.win32.win32.x86_64 &lt;version&gt;4.9.1 ...

    使用 SWT 写图形化界面的例子(eclipse)

    在Eclipse中,你可以使用JFace库来进一步增强SWT的功能,JFace提供了一些高级组件和数据绑定功能,简化了界面开发。不过,本例主要关注基础的SWT使用。 开始编写SWT程序,你需要导入必要的库: ```java import org...

    在SWT中使用OLE操纵Excel入门培训文档

    在SWT中使用OLE操纵Excel入门培训文档,里面整理了很多资源,下载的请使劲戳

    SWT/JFACE客户端登录窗口例子

    在这个“SWT/JFACE 客户端登录窗口例子”中,我们可以预期会看到如何使用这两个库来创建一个基本的登录窗口。通常,这样的窗口会包含用户名和密码输入框,以及登录、取消等按钮。以下是一些可能涉及的知识点: 1. *...

    java SWT官网例子

    java的一套GUI库,eclipse就是用...这套例子是swt官网上的小型例子,每个文件介绍一个简单的功能。 官方网址 http://www.eclipse.org/swt/snippets/ 需要的界面效果可以再官方网址上找到说明,再查看对应的java文件即可

    Eclipse+SWTJFace开发实战精解,SWT例子,Eclipse开发入门与项目实践+源代码

    4. **SWT例子**:资源包中的SWT例子可能包括如何使用SWT创建各种控件、布局管理、事件处理等内容。这些实例可以帮助开发者理解SWT的工作原理,并提供实际操作经验。 5. **Eclipse开发入门**:对于初学者,资源包...

    swt中treeview和tableview实例

    swt中treeview和tableview实例,有助于理解这两个控件的使用。另外附带html页面。。可读性更强。

    使Excel嵌入到SWT窗口中

    在本例中,我们使用OLE技术将Excel嵌入到SWT窗口中。OLE技术可以使不同的应用程序之间实现数据的交互和共享,使得应用程序之间的集成变得更加紧密。 知识点四:OleFrame和OleClientSite的使用 在本例中,我们使用...

    使用java SWT编写界面的例子,多代码

    在压缩包`swt_example`中,可能包含了使用SWT编写的具体代码示例,你可以通过阅读和运行这些代码来深入理解SWT的工作原理和实际应用。SWT的学习和实践对于开发桌面应用程序的Java开发者来说是非常有价值的,它能帮助...

    Eclipse中使用SWT进行界面设计

    在Eclipse中使用SWT进行界面设计涉及到一系列关键概念和技术,包括SWT的起源与优势、SWT应用程序的组成以及开发环境的配置。 1. 为什么要使用SWT? SWT,全称Standard Widget Toolkit,是由IBM开发的一个跨平台的...

    在SWING、SWT中嵌入浏览器

    在SWT中,我们可以使用`Browser`类来嵌入浏览器功能。这个类允许在SWT应用中加载和显示HTML页面,支持JavaScript交互,甚至可以执行一些基本的浏览器操作,如前进、后退、刷新和停止加载。 集成浏览器的关键步骤...

    java程序设计之swt教程

    在实际项目中,开发者通常会结合JFace库使用SWT,JFace提供了一些高级抽象和便利的功能,如数据绑定、视图和编辑器框架等,简化了SWT的使用。JFace的`ViewPart`和`EditorPart`类可以帮助构建Eclipse插件和RCP(Rich ...

    swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位

    开发者需要64位的Java环境,并将“swt-64.jar”添加到类路径中,以便在他们的应用中使用SWT。通过使用SWT,他们可以创建出既美观又响应迅速的桌面应用,这些应用能够无缝地融入用户的64位Windows环境。

Global site tag (gtag.js) - Google Analytics