2012-03-08 155 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();