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; 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. * Gibt an, ob ein Mausknopf derzeit gedrückt ist.
*/ */

View File

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