装在帆布LWJGL显示无法生成鼠标事件 [英] LWJGL Display mounted on Canvas fails to generate Mouse Events

查看:350
本文介绍了装在帆布LWJGL显示无法生成鼠标事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的最终目标是能够利用额外的鼠标按键在Java中。目前,LWJGL的JInput似乎不能够检测多于三个按钮。要使用Java的System.setProperty(以下简称sun.awt.enableExtraMouseButtons,真),我试过显示器安装到一个AWT画布,一个JFrame内。不幸的是,这似乎并没有工作,我不确定这是为什么。 [我要指出,我已经离开从Java的一段时间]

 进口java.awt.Canvas中;
进口java.awt.event.MouseListener;
进口java.awt.event.MouseEvent中;进口javax.swing.JFrame中;进口org.lwjgl.LWJGLException;
进口org.lwjgl.opengl.Display;
进口org.lwjgl.opengl.DisplayMode;
进口org.lwjgl.opengl.GL11;公共类MainCanvas扩展画布实现的MouseListener
{
    私有静态最后的serialVersionUID长1L =;    公共无效的mouseClicked(的MouseEvent E)
    {
        的System.out.println(e.getButton());
    }
    公共无效的mouseEntered(的MouseEvent E)
    {
        的System.out.println(e.getButton());
    }
    公共无效的mouseExited(的MouseEvent E)
    {
        的System.out.println(e.getButton());
    }
    公共无效鼠标pressed(的MouseEvent E)
    {
        的System.out.println(e.getButton());
    }
    公共无效的mouseReleased(的MouseEvent E)
    {
        的System.out.println(e.getButton());
    }    公共无效的init()
    {
    }
    公共静态无效的主要(字串[] args)
    {
        MainCanvas mainCanvas =新MainCanvas();
        JFrame中的mainFrame =新的JFrame(简化);        mainFrame.setSize(640,480);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.getContentPane()加(mainCanvas)。
        mainFrame.setVisible(真);        mainCanvas.addMouseListener(mainCanvas);        尝试
        {
            DISPLAYMODE mainDisplay =新DISPLAYMODE(640,480);
            Display.setDisplayMode(mainDisplay);
            Display.setParent(mainCanvas);
            Display.create();
        }
        赶上(LWJGLException乐)
        {
            的System.out.println(哦,亲爱的。);
        }        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0,640,480,0,1,-1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);        而(!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();
    }
}


解决方案

我在IRC FreeNode的研究员几个月回来讲话。要点是,因为画布是一个重量级的组件,事件不会上升到JFrame水平。一帧来代替它被使用。

My ultimate goal is to be able to make use of additional mouse buttons in Java. Currently, LWJGL's JInput doesn't seem capable of detecting more than three buttons. To make use of Java's System.setProperty("sun.awt.enableExtraMouseButtons", "true"), I've tried mounting the Display onto an AWT Canvas, within a JFrame. Unfortunately, this does not appear to work, and I am unsure why. [I should note that I've been away from Java for a some time]

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

解决方案

I spoke with the fellows in the FreeNode IRC some months back. The gist is because the canvas is a heavyweight component, events would not rise to the JFrame level. A Frame has to be used in its stead.

这篇关于装在帆布LWJGL显示无法生成鼠标事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆