События Java mouse не записываются JOGL

137
15

Я хочу написать программу Java и Jogl. У нас есть Jframe и GLJPanel, которые находятся внутри этого кадра. Программа получает события мыши, и когда пользователь нажимает на кадр, он рисует точку в этой позиции. Я написал для этой программы следующий код, но есть проблема. Когда вы нажимаете на фрейм, событие для этого клика не выдается или выдается с задержкой. Скажите, пожалуйста, как это исправить.

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package jogli;

import com.jogamp.opengl.util.FPSAnimator;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.awt.GLJPanel;
import javax.swing.JFrame;

/**
*
* @author HESSAM
*/
public class JOGLI extends JFrame {

/**
* @param args the command line arguments
*/
private GLJPanel pan;

public JOGLI()
{
pan = new Curve();
this.setMinimumSize( new Dimension( 800 , 600 ) );
this.add(pan);
this.pack();
this.setVisible(true);
final FPSAnimator anime1 = new FPSAnimator( pan , 24 , true );
anime1.start();
this.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// Use a dedicate thread to run the stop() to ensure that the
// animator stops before program exits.
new Thread() {
@Override
public void run() {
if (anime1.isStarted()) {
anime1.stop();
}
System.exit(0);
}
}.start();
}
});
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new JOGLI().setVisible(true);
}
});
// TODO code application logic here
}
}

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package jogli;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt.GLJPanel;

/**
*
* @author HESSAM
*/
public class Curve extends GLJPanel implements GLEventListener {
private ArrayList < int[] > pointSet;
private GL2 mygl;
public Curve()
{
pointSet = new ArrayList<>();
this.addGLEventListener(this);
this.addMouseListener( new MouseAdapter() {
@Override
public void mouseClicked( MouseEvent e )
{
final int[] newPoint = { 0 , 0 , 0 };
newPoint[0] = e.getX();
newPoint[1] = getSize().height - e.getY();
pointSet.add(newPoint);
display();

}
});
}
@Override
public void init(GLAutoDrawable drawable) {
mygl = drawable.getGL().getGL2();
mygl.glClearColor(0.15f, 0.15f , 0.15f , 1);
mygl.glClear(mygl.GL_COLOR_BUFFER_BIT);
mygl.glLoadIdentity();
mygl.glMatrixMode(mygl.GL_PROJECTION);
mygl.glLoadIdentity();
mygl.glOrtho(0, getSize().width, 0, getSize().height, -1, 1);
mygl.glMatrixMode(mygl.GL_MODELVIEW);
}

@Override
public void dispose(GLAutoDrawable drawable) {
}

@Override
public void display(GLAutoDrawable drawable) {
mygl = drawable.getGL().getGL2();
mygl.glClear(mygl.GL_COLOR_BUFFER_BIT);
mygl.glBegin(mygl.GL_POINTS);
{
mygl.glColor3d(1, 0.1, 0.5);
for( int i = 0 ; i < pointSet.size() ; ++i )
{
for(int j = -2 ; j <= 2 ; ++j ) {
for(int k = -2 ; k <= 2 ; ++k ) {
mygl.glVertex2d(pointSet.get(i)[0] + j, pointSet.get(i)[1] + k);
}
}
}
}
mygl.glEnd();
}

@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
}

}

спросил(а) 2021-01-19T17:56:49+03:00 2 месяца, 3 недели назад
1
Решение
86

Вход AWT EventDispatchThread блокируется рендерингом и наоборот, это ограничение по дизайну AWT, поскольку оно выполняет ввод и рендеринг в одном потоке.

Рекомендуется использовать систему ввода-вывода JOGAmp JOGL NEWT. NEWT предназначен для ввода данных параллельно рендерингу. Вы можете напрямую использовать GLWindow (NEWT) или использовать NewtCanvasAWT (GLWindow внутри приложения AWT), а затем использовать NEWTEventFiFo для ввода ввода в цикл визуализации. http://jogamp.org/jogl/doc/NEWT-Overview.html

ответил(а) 2021-01-19T17:56:49+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема