/ / JOGL Bildschirmkoordinaten sind off - java, swing, awt, jogl

JOGL-Bildschirmkoordinaten sind off - java, swing, awt, jogl

Angesichts dieses einfachen Beispiels, das ich von der bekommen habeJOGAMP-Wiki, warum sollten die Mauskoordinaten um 40 in y-Richtung und um 20 in x-Richtung abweichen? Wenn Sie in der rechten unteren Ecke des Bildschirms klicken, werden die Koordinaten (620, 440) und nicht (640, 480) wie erwartet angezeigt.

Danke für die Hilfe!

Hier ist das Programm:

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();
}
}

Antworten:

2 für die Antwort № 1

Die Aussage jframe.setSize(640, 480) gibt die Größe der an ganz Rahmen, einschließlich aller Dekorationen wie Ziehleiste und Rand. Sie könnten die Rahmen überprüfen getInsets().

Ebenfalls, GLCanvas ist eine schwere Komponente. Anstatt zu mischen, sollten Sie es in eine AWT einbauen Frame.