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();
}
}
上面的程序是用鼠标画圆的例子,