Дисплей LWJGL, смонтированный на Canvas, не может генерировать события мыши - PullRequest
0 голосов
/ 11 декабря 2011

Моя конечная цель - использовать дополнительные кнопки мыши в Java. В настоящее время JWput из LWJGL не способен обнаружить более трех кнопок. Чтобы использовать Java System.setProperty («sun.awt.enableExtraMouseButtons», «true»), я попытался смонтировать Display на холст AWT в JFrame. К сожалению, это не работает, и я не уверен, почему. [Должен заметить, что некоторое время я был далеко от Явы]

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 ]

1 голос
/ 28 февраля 2012

Я разговаривал с ребятами из IRC FreeNode несколько месяцев назад.Суть в том, что холст является тяжеловесным компонентом, события не будут повышаться до уровня JFrame.Вместо него должна использоваться рамка.

1 голос
/ 25 марта 2012

По сути, ответ вы не можете: то есть с lwjgl 2.8.2 только для Windows.

Причина в том, что реализация lwjgl в Windows является ключевой структурой данных, необходимой AWT для обработки событий.

http://www.java -gaming.org / темы / не-надстройку MouseListener-на-Java-АВТ-холст-с-LWJGL-на-окна / 24650 / сообщ / 208505 / view.html # msg208505

0 голосов
/ 16 января 2012

Попробуйте вместо этого добавить слушателя мыши в JFRame.Я сталкивался с этим раньше, и я думаю, что именно так я и решил.

...