安装在Canvas上的LWJGL显示无法生成鼠标事件

时间:2011-12-10 22:43:00

标签: java canvas mouseevent awt lwjgl

我的最终目标是能够在Java中使用其他鼠标按钮。目前,LWJGL的JInput似乎无法检测超过三个按钮。为了使用Java的System.setProperty(“sun.awt.enableExtraMouseButtons”,“true”),我尝试将显示器安装到JFrame中的AWT Canvas上。不幸的是,这似乎不起作用,我不确定为什么。 [我应该注意到我已经离开Java一段时间了]

import java.awt.Canvas;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

public class MainCanvas extends Canvas implements MouseListener
{
    private static final long serialVersionUID = 1L;

    public void mouseClicked(MouseEvent e)
    {
        System.out.println(e.getButton());
    }
    public void mouseEntered(MouseEvent e)
    {
        System.out.println(e.getButton());
    }
    public void mouseExited(MouseEvent e)
    {
        System.out.println(e.getButton());
    }
    public void mousePressed(MouseEvent e)
    {
        System.out.println(e.getButton());
    }
    public void mouseReleased(MouseEvent e)
    {
        System.out.println(e.getButton());
    }

    public void init()
    {
    }


    public static void main(String[] args)
    {
        MainCanvas mainCanvas = new MainCanvas();
        JFrame mainFrame = new JFrame("Simplify");

        mainFrame.setSize(640, 480);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.getContentPane().add(mainCanvas);
        mainFrame.setVisible(true);

        mainCanvas.addMouseListener(mainCanvas);

        try
        {
            DisplayMode mainDisplay = new DisplayMode(640, 480);
            Display.setDisplayMode(mainDisplay);
            Display.setParent(mainCanvas);
            Display.create();
        }
        catch (LWJGLException le)
        {
            System.out.println("Oh dear.");
        }

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, 640, 480, 0, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);

        while (!Display.isCloseRequested())
        {
            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);  
            GL11.glColor3f(0.5f,0.5f,1.0f);
            GL11.glBegin(GL11.GL_QUADS);
                GL11.glVertex2f(100,100);
                GL11.glVertex2f(100+200,100);
                GL11.glVertex2f(100+200,100+200);
                GL11.glVertex2f(100,100+200);
            GL11.glEnd();
            Display.update();
        }
        Display.destroy();
    }
}

3 个答案:

答案 0 :(得分:1)

几个月前,我与FreeNode IRC的同事们进行了交谈。要点是因为画布是一个重量级组件,事件不会升级到JFrame级别。必须使用框架。

答案 1 :(得分:1)

基本上,答案是你不能:即仅在Windows上使用lwjgl 2.8.2。

原因是lwjgl的Windows实现破坏了AWT对事件处理所需的关键数据结构。

http://www.java-gaming.org/topics/cannot-add-mouselistener-to-java-awt-canvas-with-lwjgl-on-windows/24650/msg/208505/view.html#msg208505

答案 2 :(得分:0)

尝试将鼠标侦听器添加到JFRame。我之前碰到过这个问题,我想我就是这样解决的。