2012-03-13 141 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