2012-03-13 6 views
0

JOGAMP 위키에서 얻은 간단한 예제를 통해 마우스 좌표가 y 방향으로 40도 x 방향으로 20도 벗어나는 이유는 무엇입니까? 화면의 오른쪽 하단을 클릭하면 좌표 (620, 440)가 아닌 (640, 480)이 표시됩니다.JOGL 화면 좌표가 꺼져 있습니다

도움 주셔서 감사합니다.

다음은 프로그램의 :

import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.GLProfile; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.awt.GLCanvas; 
import javax.swing.JFrame; 

import java.awt.BorderLayout; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

/** 
* A minimal program that draws with JOGL in a Swing JFrame using the AWT GLCanvas. 
* 
* @author Wade Walker 
*/ 
public class OneTriangleSwingGLCanvas implements MouseListener{ 

    static { 
     // setting this true causes window events not to get sent on Linux if you run from inside Eclipse 
     GLProfile.initSingleton(false); 
    } 

    public static void main(String [] args) { 
     GLProfile glprofile = GLProfile.getDefault(); 
     GLCapabilities glcapabilities = new GLCapabilities(glprofile); 
     final GLCanvas glcanvas = new GLCanvas(glcapabilities); 

     OneTriangleSwingGLCanvas mouse = new OneTriangleSwingGLCanvas(); 
     glcanvas.addMouseListener(mouse); 

     glcanvas.addGLEventListener(new GLEventListener() { 

      @Override 
      public void reshape(GLAutoDrawable glautodrawable, int x, int y, int width, int height) { 
       OneTriangle.setup(glautodrawable.getGL().getGL2(), width, height); 
      } 

      @Override 
      public void init(GLAutoDrawable glautodrawable) { 
      } 

      @Override 
      public void dispose(GLAutoDrawable glautodrawable) { 
      } 

      @Override 
      public void display(GLAutoDrawable glautodrawable) { 
       OneTriangle.render(glautodrawable.getGL().getGL2(), glautodrawable.getWidth(), glautodrawable.getHeight()); 
      } 
     }); 

     final JFrame jframe = new JFrame("One Triangle Swing GLCanvas"); 
     jframe.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowevent) { 
       jframe.dispose(); 
       System.exit(0); 
      } 
     }); 

     jframe.getContentPane().add(glcanvas, BorderLayout.CENTER); 
     jframe.setSize(640, 480); 
     jframe.setVisible(true); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     // TODO Auto-generated method stub 
     System.out.println("Mouse pressed at : (" + e.getX() + ", " + e.getY() + ")"); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 
} 

//OneTriangle.java 

import javax.media.opengl.GL; 
import javax.media.opengl.GL2; 
import javax.media.opengl.glu.GLU; 

public class OneTriangle { 
    protected static void setup(GL2 gl2, int width, int height) { 
     gl2.glMatrixMode(GL2.GL_PROJECTION); 
     gl2.glLoadIdentity(); 

     // coordinate system origin at lower left with width and height same as the window 
     GLU glu = new GLU(); 
     glu.gluOrtho2D(0.0f, width, 0.0f, height); 

     gl2.glMatrixMode(GL2.GL_MODELVIEW); 
     gl2.glLoadIdentity(); 

     gl2.glViewport(0, 0, width, height); 
    } 

    protected static void render(GL2 gl2, int width, int height) { 
     gl2.glClear(GL.GL_COLOR_BUFFER_BIT); 

     // draw a triangle filling the window 
     gl2.glLoadIdentity(); 
     gl2.glBegin(GL.GL_TRIANGLES); 
     gl2.glColor3f(1, 0, 0); 
     gl2.glVertex2f(0, 0); 
     gl2.glColor3f(0, 1, 0); 
     gl2.glVertex2f(width, 0); 
     gl2.glColor3f(0, 0, 1); 
     gl2.glVertex2f(width/2, height); 
     gl2.glEnd(); 
    } 
} 
+0

왼쪽 상단 모서리의 좌표는 무엇입니까? – korifey

+0

좌표는 (0, 0) – Cuthbert

답변

2

jframe.setSize(640, 480)은 드래그 바 및 테두리와 같은 장식을 포함하여 전체 프레임의 크기를 지정합니다. 프레임의 getInsets()을 검사 할 수 있습니다.

또한 GLCanvas은 중량 구성 요소입니다. 혼합하는 것이 아니라 AWT Frame에 추가하는 것을 고려하십시오.

+0

입니다. getInsets()를 사용해 보았는데 테두리 및 제목 표시 줄의 크기를 반환합니다. 그런 다음 폭과 높이에 해당 값을 추가하여 프레임의 크기를 조정했습니다. 하지만 여전히 잘못된 좌표가 표시됩니다. – Cuthbert

+0

마지막 댓글을 스크래치합니다. 나는 센터 대신 BorderLayout.SOUTH를 사용하여 프레임에 glcanvas를 추가했으며 왼쪽 하단 모서리를 볼 때 좌표가 정확합니다. 그러나 여전히 크기를 조정 한 후에도 윈도우의 오른쪽과 오른쪽에 공간이 부족합니다. – Cuthbert

+0

'Frame'의 기본 레이아웃은'BorderLayout'입니다. 'GridLayout'을 시도해 볼 수도 있습니다. 이 'Panel' [example] (http://stackoverflow.com/a/3538251/230513)의 기본값은'FlowLayout'이며 올바른 지오메트리를가집니다. – trashgod

관련 문제