0
我一直在使用JOGL2與Java和我真的有一個與鼠標事件監聽器的問題。我可以得到鼠標監聽,如果我用公共無效的mouseDragged(的MouseEvent E),以更新其x和y位置,但它不會在公共無效顯示屏上重繪(GLAutoDrawable gLDrawable)Java JOGL2和鼠標監聽器
這裏是我的代碼是如何工作的: 這就是窗口和聽衆構造
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.GL2;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.swing.JFrame;
import javax.media.opengl.GLAutoDrawable;
public class HelloWorld
{
public static void main(String[] args)
{
// setup OpenGL Version 2
GLProfile profile = GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new GLCapabilities(profile);
Renderer render = new Renderer();
// The canvas is the widget that's drawn in the JFrame
GLCanvas glcanvas = new GLCanvas(capabilities);
glcanvas.addGLEventListener(render);
glcanvas.addMouseListener(render);
glcanvas.addMouseMotionListener(render);
glcanvas.setSize(800, 600);
JFrame frame = new JFrame("Graphics Demo");
frame.getContentPane().add(glcanvas);
// shutdown the program on windows close event
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
frame.setSize(frame.getContentPane().getPreferredSize());
frame.setVisible(true);
}
}
這裏我主要方法是我的OpenGL渲染類,它只是渲染一幀,它不會重新渲染,除非我調整出於某種原因窗口大小。如果我決定使用鼠標偵聽器,它將更新這些值,但不會更新渲染。爲什麼是這樣?
import java.io.*;
import javax.imageio.ImageIO;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.FPSAnimator;
import javax.media.opengl.glu.GLUquadric;
import java.awt.Graphics2D;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.awt.event.*;
class Renderer implements GLEventListener, MouseListener, MouseMotionListener
{
private GLU glu = new GLU();
float x = 1;
float y = 1;
float z = 1;
private GLUquadric quadric;
GLCanvas canvas;
public void init(GLAutoDrawable gLDrawable)
{
System.out.println("INIT CALLED");
}
public void display(GLAutoDrawable gLDrawable)
{
final GL2 gl = gLDrawable.getGL().getGL2();
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
/*MODELS LOADED HERE*/
gl.glLoadIdentity();
gl.glTranslatef(0.0f, -9.0f, -150.0f); //-1.5f 0.0f -6.0f
gl.glRotatef(15f+x, 45f+x, 0f+y,0f); //15 45 0 0
OBJloader playingField = new OBJloader("PlayingField.obj", "Crema_Timber.jpg");
OBJloader coin = new OBJloader("coin.obj","early_shilling.jpg");
OBJloader tower = new OBJloader("Tower1.obj","stone.jpg");
OBJloader tower2 = new OBJloader("Tower2.obj","stone.jpg");
/* 3D RENDERING COMPUTED HERE */
playingField.DrawModel(gl);
coin.DrawModel(gl);
tower.DrawModel(gl);
tower2.DrawModel(gl);
}
public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged)
{
System.out.println("displayChanged called");
}
public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height)
{
System.out.println("reshape() called: x = "+x+", y = "+y+", width = "+width+", height = "+height);
final GL2 gl = gLDrawable.getGL().getGL2();
if (height <= 0)
{
height = 1;
}
final float h = (float) width/(float) height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, h, 1.0, 200.0);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
}
public void dispose(GLAutoDrawable arg0)
{
System.out.println("dispose() called");
}
@Override
public void mouseClicked(MouseEvent arg0)
{
// TODO Auto-generated method stub
System.out.println("Mouse Clicked");
}
@Override
public void mouseEntered(MouseEvent arg0)
{
// TODO Auto-generated method stub
System.out.println("Mouse Entered Frame");
}
@Override
public void mouseExited(MouseEvent arg0)
{
// TODO Auto-generated method stub
System.out.println("Mouse Exited Frame");
}
@Override
public void mousePressed(MouseEvent arg0)
{
// TODO Auto-generated method stub
System.out.println("Mouse is pressed.");
}
@Override
public void mouseReleased(MouseEvent arg0)
{
// TODO Auto-generated method stub
System.out.println("Mouse has been released");
}
//HERE IS THE PROBLEM, THE DISPLAY WILL NOT UPDATE THIS INPUT
@Override
public void mouseDragged(MouseEvent e)
{
// TODO Auto-generated method stub
System.out.println("Mouse is being dragged");
x = e.getX();
y = e.getY();
System.out.println("x = "+x);
System.out.println("y = "+y);
}
@Override
public void mouseMoved(MouseEvent arg0)
{
// TODO Auto-generated method stub
System.out.println("Mouse has moved.");
}
}
你可能會注意到,有一定的功能,即說: OBJloader SOMETHING =新OBJloader( 「SOMETHING.obj」, 「SOMETHING.jpg」);我有另一個類加載OBJ文件和紋理他們,它的繪圖功能很簡單,它只是讀取數組中的數據並調用glDrawArrays(也注意所有導入,其實際上稍後使用)。
我需要這方面做的就是找出一個辦法讓過去的事情這款鼠標在你HelloWorld類更新
使用動畫類更新(也許工作) – Tofiq 2012-04-02 22:15:55