Synchronisierte EventQueue für InputEvents

Eingaben der Swing Componente werden nun in eine interen EventQueue einsortiert, die einmal pro Frame abgearbeitet wird. Das verhindert Probleme bei der Synchronisierung der ZM mit dem EDT von Swing.

Im Moment werden die Originalen InputEvent gespeichert und verarbeitet. In Zukunft könnte eine eigene Event-Klasse sinnvoll sein, die die Events für die Nutzer vereinfacht (siehe Processing).
This commit is contained in:
ngb
2022-07-06 20:39:34 +02:00
parent 81624e3a7a
commit ffe9bef5fd
2 changed files with 84 additions and 74 deletions

View File

@@ -289,6 +289,18 @@ public class Constants {
*/
public static double pmouseY = 0.0;
/**
* Die aktuelle (<em>current</em>) {@code x}-Koordinate der Maus
* (wird bei jeder Mausbewegung aktualisiert).
*/
public static double cmouseX = 0.0;
/**
* Die aktuelle (<em>current</em>) {@code y}-Koordinate der Maus
* (wird bei jeder Mausbewegung aktualisiert).
*/
public static double cmouseY = 0.0;
/**
* Gibt an, ob ein Mausknopf derzeit gedrückt ist.
*/

View File

@@ -321,67 +321,13 @@ public class Zeichenmaschine extends Constants {
settings();
// Listener hinzufügen, um auf Maus- und Tastatureingaben zu hören.
//canvas.addMouseListener(this);
//canvas.addMouseMotionListener(this);
//canvas.addKeyListener(this);
canvas.addMouseListener(new MouseInputListener() {
@Override
public void mouseClicked( MouseEvent e ) {
enqueueEvent(e);
}
InputListener inputListener = new InputListener();
canvas.addMouseListener(inputListener);
canvas.addMouseMotionListener(inputListener);
canvas.addMouseWheelListener(inputListener);
canvas.addKeyListener(inputListener);
@Override
public void mousePressed( MouseEvent e ) {
enqueueEvent(e);
}
@Override
public void mouseReleased( MouseEvent e ) {
enqueueEvent(e);
}
@Override
public void mouseEntered( MouseEvent e ) {
}
@Override
public void mouseExited( MouseEvent e ) {
}
@Override
public void mouseDragged( MouseEvent e ) {
enqueueEvent(e);
}
@Override
public void mouseMoved( MouseEvent e ) {
enqueueEvent(e);
}
});
/*
canvas.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved( MouseWheelEvent e ) {
enqueueEvent(e);
}
});
*/
canvas.addKeyListener(new KeyListener() {
@Override
public void keyTyped( KeyEvent e ) {
enqueueEvent(e);
}
@Override
public void keyPressed( KeyEvent e ) {
enqueueEvent(e);
}
@Override
public void keyReleased( KeyEvent e ) {
enqueueEvent(e);
}
});
// Programm beenden, wenn Fenster geschlossen wird
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing( WindowEvent e ) {
@@ -1136,7 +1082,7 @@ public class Zeichenmaschine extends Constants {
private void enqueueEvent( InputEvent evt ) {
eventQueue.add(evt);
if (isPaused()) {
if( isPaused() ) {
dispatchEvents();
}
}
@@ -1146,7 +1092,6 @@ public class Zeichenmaschine extends Constants {
while( !eventQueue.isEmpty() ) {
InputEvent evt = eventQueue.poll();
// ???
switch( evt.getID() ) {
case KeyEvent.KEY_TYPED:
case KeyEvent.KEY_PRESSED:
@@ -1188,17 +1133,9 @@ public class Zeichenmaschine extends Constants {
}
private void handleMouseEvent( MouseEvent evt ) {
if( mouseEvent != null && evt.getComponent() == canvas ) {
pmouseX = mouseX;
pmouseY = mouseY;
mouseX = evt.getX();
mouseY = evt.getY();
}
mouseEvent = evt;
switch( evt.getID() ){
switch( evt.getID() ) {
case MouseEvent.MOUSE_CLICKED:
mouseClicked(evt);
break;
@@ -1213,9 +1150,11 @@ public class Zeichenmaschine extends Constants {
mousePressed(evt);
break;
case MouseEvent.MOUSE_DRAGGED:
//saveMousePosition(evt);
mouseDragged(evt);
break;
case MouseEvent.MOUSE_MOVED:
//saveMousePosition(evt);
mouseMoved(evt);
break;
}
@@ -1266,8 +1205,8 @@ public class Zeichenmaschine extends Constants {
pmouseX = mouseX;
pmouseY = mouseY;
mouseX = event.getX();
mouseY = event.getY();
mouseX = cmouseX;
mouseY = cmouseY;
}
}
@@ -1349,7 +1288,7 @@ public class Zeichenmaschine extends Constants {
delta = (System.nanoTime() - beforeTime) / 1000000000.0;
beforeTime = System.nanoTime();
//saveMousePosition(mouseEvent);
saveMousePosition(mouseEvent);
if( state != Options.AppState.PAUSED ) {
handleUpdate(delta);
@@ -1444,6 +1383,65 @@ public class Zeichenmaschine extends Constants {
@Override
public int compareTo( Delayed o ) {
return (int) (startTime- ((DelayedTask)o).startTime);
class InputListener implements MouseInputListener, MouseMotionListener, MouseWheelListener, KeyListener{
@Override
public void mouseClicked( MouseEvent e ) {
enqueueEvent(e);
}
@Override
public void mousePressed( MouseEvent e ) {
enqueueEvent(e);
}
@Override
public void mouseReleased( MouseEvent e ) {
enqueueEvent(e);
}
@Override
public void mouseEntered( MouseEvent e ) {
// Intentionally left blank
}
@Override
public void mouseExited( MouseEvent e ) {
// Intentionally left blank
}
@Override
public void mouseDragged( MouseEvent e ) {
cmouseX = e.getX();
cmouseY = e.getY();
enqueueEvent(e);
}
@Override
public void mouseMoved( MouseEvent e ) {
cmouseX = e.getX();
cmouseY = e.getY();
enqueueEvent(e);
}
@Override
public void keyTyped( KeyEvent e ) {
enqueueEvent(e);
}
@Override
public void keyPressed( KeyEvent e ) {
enqueueEvent(e);
}
@Override
public void keyReleased( KeyEvent e ) {
enqueueEvent(e);
}
@Override
public void mouseWheelMoved( MouseWheelEvent e ) {
// enqueueEvent(e);
}
}