2012-03-13 31 views
0

JOGAMP wikiから得たこの簡単な例を考えてみると、マウス座標が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

関連する問題