Der Trick besteht darin, ein KeyEvent abzufangen und dies beim Bewegen der Maus abzufragen. Hierzu wird zunächst eine Instanz eines
KeyEvent gebildet. Ihr werden 5 Parameter übergeben:
- die das Ereignis auslösende Komponente, hier das JPanel
- ein int-Wert des Ereignis-Typs, hier ist es unerheblich was übergeben wird, da wir auf das Drücken und Loslassen der Tasten reagieren wollen
- ein long-Wert, der die Zeit des Events angibt, ebenfalls 0
- ein Modifier (z.B. InputEvent.CTRL_DOWN_MASK), auch dieser 0
- ein int-Wert, der den Key-Code der auslösenden Taste wiedergibt, auch hier übergeben wir 0, da wir auf das Drücken und Loslassen der Taste reagieren wollen
- ein int-Wert, der den Key-Code der Taste wiedergibt, die erzeugt werden soll, dies wollen wir nicht, somit verwenden wir KeyEvent.CHAR_UNDEFINED
Im Konstruktor muss die Klasse beim KeyListener angemeldet und durch den Code
this.setFocusable(true);
explizit fokussierbar gesetzt werden, da dies ein JPanel nicht von alleine ist.
Der KeyListener macht nun zweierlei:
-
In der Methode keyPressed(KeyEvent e) weist er der neu erzeugten Ereignis-Instanz sein KeyEvent zu
-
In der Methode keyReleased(KeyEvent e) setzt er diese wieder auf null
In der
MouseMotionListener-Methode
mouseDragged(MouseEvent e) wird nun - vorausgesetzt die Ereignis-Instanz ist ungleich
null - der Endpunkt der zu zeichnenden Linie abhängig von der gedrückten Linie auf den x- oder y-Wert der Startposition gesetzt.
Der Rest des Codes entspricht '
Linie_ziehen'.