Jogl에서 MouseEvent 쓰는 법
Jogl에 MouseEvent를 쓰는 법은 여느 Java Applet 이나 Application에서 MouseEvent 를 쓰는 것과 별반 다를 것이 없다. 여기서는 Mouse를 클릭하는 곳에 작은 네고꼴이 옮겨 지는 Applet을 만들어 설명할까한다. 먼저 GLCanvas를 생성하고 GLEventListener의 인터페이스를 부착시키고 하는 따위 기본인프라를 구축하는 JoglApplet 클래스를 작성하는 법은 12째 강좌에서 설명한 바 있다. 12 강좌의 애플랫클라스와 다른 점은 GLEventListener의 자식 클래스를 정의하는데 애플렛윈도우의 사이즈를 인수로 전달하였는데 여기서 그 쓸모가 없으므로 생략한다.
그 대신 마우스 이벤트와 관련해서 여기서 정의된 (10, 16째줄) canvas를 인자로 전달해야 할 필요가 있다. 간단한 방법은 GLEventListener의 자식클래스 JoglDisplay 에 GLCanvas의 객체변수 하나를 정의하고 거기에 canvas 의 참조를 제 22째 줄 처럼 넘기는 것이다.
- import java.applet.Applet;
- import java.awt.*;
- import net.java.games.jogl.*;
- @SuppressWarnings("serial")
- public class JoglApplet extends Applet {
- static int WIDTH = 500, HEIGHT = 300 ;
- GLCanvas canvas;
- JoglDisplay listener ;
-
- public void init() {
- GLCapabilities glc = new GLCapabilities();
- canvas = GLDrawableFactory.getFactory().createGLCanvas(glc);
- add(canvas, BorderLayout.CENTER);
- listener = new JoglDisplay();
- canvas.addGLEventListener(listener);
- canvas.addMouseListener(listener);
- listener.glc = canvas;
- setSize(WIDTH, HEIGHT);
- canvas.setSize(WIDTH, HEIGHT);
- }
- }
|
아래에 GLEventListener의 자식클래스 JoglDisplay를 정의한 것이다.
아래의 코드 중에서 54째 줄에서 56째 줄이 Jogl 과 MouseEvent를 통합하기 위해서 불가피하게 변환시키는 코드가 된다. Jogl 은 자리표의 y의 증가 방향이 아래에서 위로 올라가는 방향이 되는데 MouseEvent 에 마우스 이벤트가 일어난 자리표는 위에서 아래로 가는 방향이 Y 값의 증가방향이 된다. 그래서 이 서로 반대되는 자리표읽기를 융합한 부분이다. 잘 음미해 두기를 권장한다.
- import java.awt.*;
- import java.awt.event.*;
- import net.java.games.jogl.*;
- public class JoglDisplay
- implements GLEventListener, MouseListener
- {
- int xPosition = 50;
- int yPosition = 50;
- GLCanvas glc;
- public void init(GLDrawable drawable) {
- GL gl = drawable.getGL();
- GLU glu = drawable.getGLU();
- gl.glClearColor(0.0f, 0.0f,0.0f, 0.0f);
- gl.glViewport(0, 0, 100, 100);
- gl.glMatrixMode(GL.GL_PROJECTION);
- gl.glLoadIdentity();
- glu.gluOrtho2D(0.0, 100.0, 0.0, 100.0);
- }
- public void display(GLDrawable drawable) {
- GL gl = drawable.getGL();
- gl.glClear(GL.GL_COLOR_BUFFER_BIT);
- gl.glPointSize(6.0f);
- gl.glColor3f(1, 1, 1);
- gl.glBegin(GL.GL_POINTS);
- gl.glVertex2i(xPosition, yPosition);
- gl.glEnd();
- }
- public void reshape(
- GLDrawable drawable,
- int x,
- int y,
- int width,
- int height
- ) {}
- public void displayChanged(
- GLDrawable drawable,
- boolean modeChanged,
- boolean deviceChanged
- ) {}
- public void mouseClicked(MouseEvent e) {
- double x = e.getX();
- double y = e.getY();
- Component c = e.getComponent();
- double width = c.getWidth();
- double height = c.getHeight();
- xPosition = (int) ((x / width) * 100);
- yPosition = ((int) ((y / height) * 100));
- yPosition = 100 - yPosition;
- glc.repaint();
- }
- public void mouseEntered(MouseEvent e) {}
- public void mouseExited(MouseEvent e) {}
- public void mousePressed(MouseEvent e) {}
- public void mouseReleased(MouseEvent e) {}
- }
|
이 코드를 컴파일하고 실행시켜 보기 바란다. 여기를 열면 그 결과를 볼 수 있다. 마우스를 클릭해 보세요 작은 네모꼴이 마우스 클릭한 곳이 따라 온다.