2012-03-13 145 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 2012-03-13 16:21:21

+0

坐标是(0,0) – Cuthbert 2012-03-13 16:29:46

回答

2

声明jframe.setSize(640, 480)指定整个框的大小,包括任何的装饰,如拖栏和边框。您可能会检查框架的getInsets()

此外,GLCanvas是一个重量级的组件。考虑将其添加到AWT Frame,而不是混合。

+0

我试过使用getInsets(),它返回边框和标题栏的大小。然后我通过将这些值添加到宽度和高度来调整框架的大小。但是我仍然看到不正确的坐标。 – Cuthbert 2012-03-14 21:59:52

+0

划伤最后的评论。我使用BorderLayout.SOUTH而不是中心添加了glcanvas,并且当我看着左下角时,坐标是正确的。但是,即使在调整大小后,我仍然错过了窗口顶部和右侧的一些空间。 – Cuthbert 2012-03-14 22:33:30

+0

Frame的默认布局是BorderLayout。你可以尝试'GridLayout'。这个'Panel' [示例](http://stackoverflow.com/a/3538251/230513)默认为'FlowLayout'并且具有正确的几何体。 – trashgod 2012-03-15 03:33:24