2012-03-08 156 views
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类更新

+0

使用动画类更新(也许工作) – Tofiq 2012-04-02 22:15:55

回答

0

你应该开始一个动画师:

FPSAnimator animator = new FPSAnimator(canvas, 60); 
animator.start();