Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt?

phili3

Mitglied
Hallo,
ich habe eine KeyListener Klasse erstellt, die die KeyEvents des Programs bearbeitet:
Java:
public class KeyBoardListener implements KeyListener {


    private Panel panel;

    public KeyBoardListener(Panel panel){
        this.panel=panel;
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

        if(!panel.isTimerOn()){
            panel.startTimer();
        }

        panel.wordsHandler.createWordToCompare(e);  //creates the word which will be compared to the current word and will decide if color will be red or green
        panel.wordsHandler.switchWords(e);

    }


    @Override
    public void keyReleased(KeyEvent e) {


    }


}


Nun habe ich zwei verschiedene JTextFields.
Wenn ich anfange, in dem ersten zu schreiben, soll ein Timer gestartet werden.
Wenn ich in dem zweiten Textfield etwas tippe, dann soll dieser Timer nicht gestartet werden.

Code:
   private void addKeyListener(){
        KeyBoardListener keyBoardListener = new KeyBoardListener(this);
        mainTextField.requestFocus();
        mainTextField.addKeyListener(keyBoardListener);
        addWordsField.addKeyListener(keyBoardListener);
    }

Meine Idee wäre, das ich dem Constructor des KeyboardListeners einen String hinzufüge und anhand dem wird dann entschieden, welche Funktion ausgeführt wird, wenn eine Taste gedrückt wird...
Also mit einer switch Abfrage zb.

Ich kann mir aber vorstellen, dass das eleganter geht.
Danke schonmal
 

KonradN

Super-Moderator
Mitarbeiter
Also erst einmal haben die Events alle ein Source. Über den KeyEvent Parameter kannst Du also die Quelle heraus bekommen.

Generell ist aber immer die Frage, in wie weit sowas Sinn macht oder nicht. Wenn Du eine eigene Klasse hast für den KeyListener, dann sollte diese eigentlich möglichst unabhängig sein. Das wird hier aber vermutlich recht schwer, da Du eine sehr hohe Kopplung hast. Daher macht es hier Sinn, sowas als innere Klasse zu bauen. (Bei anderen Events hat man ein funktionales Interface, aber der KeyListener hat leider direkt 3 abstrakte Methoden was das leider unmöglich macht.)

Aber dennoch kann man hier einiges verbessern. Ich will Dir dazu aber einfach nur ein paar Anregungen geben:

a) KeyAdapter statt KeyListener: Wenn Du statt dem Interface KeyListener die Klasse KeyAdapter nutzt, dann musst Du nur noch keyPressed überschreiben. Damit wird der Code gleich etwas kürzer.

b) Methoden sollten nur das machen, was der Name auch sagt. Deine Methode addKeyListener() fügt nicht nur KeyListener hinzu sondern setzt auch einen Fokus. Sowas sollte man immer vermeiden.

c) Deine Idee mit einem Parameter ist schon gut. Nur eben solltest Du da keinen String nehmen sondern ein Boolean. Also ein Parameter wie startTimerOnKeypress oder so. Dann müsstest Du nicht mehr prüfen, von wo etwas kommt, sondern Du hast dann etwas wie:
Java:
   private void addKeyListener(){
        mainTextField.addKeyListener(new KeyBoardListener(this, true));
        addWordsField.addKeyListener(new KeyBoardListener(this, false));
    }

d) Deine Klasse KeyBoardListener hat einen blöden Namen. Der besagt nicht wirklich etwas aus zu der Funktionalität.

e) Die Klasse muss zu viele Internas der übergebenen Klasse kennen. Und die Klasse Panel ist deine Klasse Panel. Der Name ist auch wieder viel zu allgemein. Hier wäre es deutlich besser, wenn man da Funktionalität in deiner Klasse Panel lassen würde (Die ein besseren Namen hätte. Wenigstens GamePanel oder so, damit man merkt: Das ist programmspezifisch!).

Eine Idee könnte sein, dass man da etwas hätte wie:
Java:
public class KeyBoardListener extends KeyHandler {


    private Consumer<KeyEvent> eventConsumer;

    public KeyBoardListener(Consumer<KeyEvent> eventConsumer){
        this.eventConsumer=eventConsumer;
    }


    @Override
    public void keyPressed(KeyEvent e) {
        if (eventConsumer != null) {
            eventConsumer.accept(e);
        }
    }
}

Dann kannst Du das über Methodenreferenzen oder Lambda Ausdrücke nutzen, weil Du da in der Klasse als Parameter ein funktionales Interface hast:
Java:
   private void addKeyListener(){
        mainTextField.addKeyListener(new KeyBoardListener(this::someMethod)); // Methodenreferenz
        addWordsField.addKeyListener(new KeyBoardListener( e -> someMethod(e) )); // Lambda Expression
    }

Statt someMethod hättest Du dann zwei Methoden, die halt etwas machen und die Du da schreiben könntest. handleKeyEventMainTextField von mir aus oder etwas besseres an Funktionalität. Damit hast Du dann die Methode auch direkt in der Klasse, in der auch Dinge verändert werden.

Das nur einmal ganz auf die Schnelle etwas Feedback.
 

mihe7

Top Contributor
Bei anderen Events hat man ein funktionales Interface, aber der KeyListener hat leider direkt 3 abstrakte Methoden was das leider unmöglich macht.
Wobei man das natürlich auftrennen könnte.
Java:
interface KeyPressedHandler extends KeyListener  {
    @Override  default void keyTyped(KeyEvent e) {}
    @Override  default void keyReleased(KeyEvent e) {}
}
Nicht, dass das einen sittlichen Mehrwert hätte:
Java:
mainTextField.addKeyListener((KeyPressedHandler) e -> doSomething());

Aber Deine Idee gefällt mir, die lässt sich schön ausbauen, zum Beispiel:
Java:
class KeyHandler implements KeyListener {
    private Consumer<KeyEvent> keyPressedConsumer;
    private Consumer<KeyEvent> keyReleasedConsumer;
    private Consumer<KeyEvent> keyTypedConsumer;

    @Override
    public void keyPressed(KeyEvent e) {
        if (keyPressedConsumer != null) {
            keyPressedConsumer.accept(e);
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (keyReleasedConsumer != null) {
            keyReleasedConsumer.accept(e);
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        if (keyTypedConsumer != null) {
            keyTypedConsumer.accept(e);
        }
    }

    public void installOn(Component c) {
        c.addKeyListener(this);
    }

    public static Builder builder() {
        return new Builder();
    }

    static class Builder {
        private boolean handleKeyPressed;
        private boolean handleKeyReleased;
        private boolean handleKeyTyped;

        private Builder() {}

        public Builder handlePressed() {
            handleKeyPressed = true;
            return this;
        }

        public Builder handleReleased() {
            handleKeyReleased = true;
            return this;
        }

        public Builder handleTyped() {
            handleKeyTyped = true;
            return this;
        }

        public KeyHandler by(Consumer<KeyEvent> consumer) {
            if ( !(handleKeyPressed | handleKeyReleased | handleKeyTyped) ) {
                throw new IllegalStateException("Won't build a KeyHandler that handles nothing.");
            }

            KeyHandler handler = new KeyHandler();
            if (handleKeyPressed) handler.keyPressedConsumer = consumer;
            if (handleKeyReleased) handler.keyReleasedConsumer = consumer;
            if (handleKeyTyped) handler.keyTypedConsumer = consumer;
            return handler;
        }
    }
}

Damit kann man dann schöne Texte schreiben:
Java:
KeyHandler.builder().handlePressed().handleReleased().by(e -> System.out.println(e)).installOn(textField);
oder
Java:
KeyHandler handler = KeyHandler.builder().handlePressed().handleReleased().by(e -> System.out.println(e));
myTextFields.forEach(handler::installOn);
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Rechnen mit Brüchen, ist meine Lösung soweit richtig? Java Basics - Anfänger-Themen 4
A Methoden Guten Tag , ich wollte so machen dass wenn meine frog an eine fly/bee geht dann an meine Tafel geht der zahl +1 hoch. Java Basics - Anfänger-Themen 2
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
J Meine Mails gehen nicht raus Java Basics - Anfänger-Themen 8
W Streams in Java und was bedeutet meine Konsolen-Ausgabe? Java Basics - Anfänger-Themen 4
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
C60 Methoden Main-Methode erkennt meine Arrays nicht. Java Basics - Anfänger-Themen 7
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
O Warum ist meine Antwort falsch? Java Basics - Anfänger-Themen 3
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
B Sind meine If-Statements richtig angesetzt ? Java Basics - Anfänger-Themen 27
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
N Klassen Warum kann meine Klasse nicht auf Methoden der anderen Klasse zugreifen? Java Basics - Anfänger-Themen 6
L Worauf muss ich achten, wenn ich externe Bibliotheken für meine Anwendungen verwende? Java Basics - Anfänger-Themen 6
B Warum werden meine System.out.println's übersprungen? Java Basics - Anfänger-Themen 9
W Wie kann ich meine Methode aufrufen? Java Basics - Anfänger-Themen 29
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
H Meine Tabelle befüllen in .fxml Java Basics - Anfänger-Themen 16
E Warum kann ich meine jar-Datei nicht öffnen Java Basics - Anfänger-Themen 20
WPS1000 Input/Output Wie aktiviere ich den Daten Transfer von der RS232 in meine Java Applikation Java Basics - Anfänger-Themen 2
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
S Meine Java "Wahrsagerin" Java Basics - Anfänger-Themen 9
C Ich brauche hilfe für meine Klausur Java Basics - Anfänger-Themen 13
W Wie lasse ich meine Ausgabe nach dem Lesen verschwinden ? Java Basics - Anfänger-Themen 1
W Warum funktioniert meine if Anweisung nicht? Java Basics - Anfänger-Themen 8
R Meine Ratemaschine Java Basics - Anfänger-Themen 3
V Warum speichert meine String-Variable nummerische Werte? Java Basics - Anfänger-Themen 3
V Erste Schritte Warum geht meine continue Anweisung nicht? Java Basics - Anfänger-Themen 8
GreenTeaYT HashMap dupliziert meine Elemente? Java Basics - Anfänger-Themen 2
B Ist meine Klasse richtig kommentiert? Java Basics - Anfänger-Themen 2
J Erste Schritte Vorsicht Spaghetti-Code! Wie verschachtel ich meine If-Anweisung??? Java Basics - Anfänger-Themen 4
snipesss Eclipse Neon findet meine Projekte nicht? Java Basics - Anfänger-Themen 1
snipesss IDE findet meine .txt Datei nicht! Java Basics - Anfänger-Themen 12
J Verstehe meine HashSet Ausgabe nicht Java Basics - Anfänger-Themen 5
E Erste Schritte [Noob] Warum geht meine For-Schleife nicht? Java Basics - Anfänger-Themen 2
E Erste Schritte [Noob-Frage] Meine If-Abfrage macht nicht, was sie soll... Java Basics - Anfänger-Themen 2
J Erste Schritte .class datei in meine form inkludieren Java Basics - Anfänger-Themen 3
D Wie bekomme ich meine Ausgabe in Form von "2^x" hin? Java Basics - Anfänger-Themen 1
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
C Meine erste Funktion Java Basics - Anfänger-Themen 12
A Meine erste Bibliothek erstellen Java Basics - Anfänger-Themen 24
Z Meine ersten Gehversuche Java Basics - Anfänger-Themen 11
Dit_ Ich kenne meine Koordinaten. Wo bin ich? Java Basics - Anfänger-Themen 2
K Klassen Meine Klasse wird nicht anerkannt Java Basics - Anfänger-Themen 7
M Suche Korrektor für meine Lösung (FH: Java1 - Übungsklausur) Java Basics - Anfänger-Themen 4
D Wie kann meine Klasse in ein JPanel zeichnen? Java Basics - Anfänger-Themen 14
J Datentypen Meine Hashliste ist nicht unique Java Basics - Anfänger-Themen 5
S OOP Wie muss meine Klasse zu dieser main aussehen? Java Basics - Anfänger-Themen 5
M Meine erste Java Programmierung funzt nicht :-( Java Basics - Anfänger-Themen 34
C Denkanstoss für meine Auswertung Java Basics - Anfänger-Themen 5
L Warum erkennt java meine methode nicht? Java Basics - Anfänger-Themen 17
S Irgendwie kann ich meine Eclipse Projekte nicht mehr veraendern..? Java Basics - Anfänger-Themen 5
M Wo sind meine double-Zahlen? Java Basics - Anfänger-Themen 2
A Hilfe meine Titel werden alle abgelehnt Java Basics - Anfänger-Themen 4
K Wieso schaltet meine CheckBox von selbst um ? Java Basics - Anfänger-Themen 31
K Warum adiert meine Methode nicht die eins ? Java Basics - Anfänger-Themen 19
K Warum wird meine Graphik zwei Mal gezeichnet ? Java Basics - Anfänger-Themen 12
Kr0e Eclips + JOGL -> Wo ist meine MAIN-Funktion hin ? Java Basics - Anfänger-Themen 9
R Meine erste Klasse: Punkt Java Basics - Anfänger-Themen 3
U Habe meine .class files gelöscht. Java Basics - Anfänger-Themen 3
gummibaerchen Methode überschreibt meine Variable Java Basics - Anfänger-Themen 5
N Programm das mir anzeigt wo meine Freundin ist. Java Basics - Anfänger-Themen 10
Schandro Meine Fragensammlung Java Basics - Anfänger-Themen 9
S daten per url in meine Klasse? Java Basics - Anfänger-Themen 12
A meine eigene IO Klasse Java Basics - Anfänger-Themen 3
D Meine SetMethode geht nicht || Fenster schließen Java Basics - Anfänger-Themen 3
T Java Programm ordnet meine Objecte immer falsch an Java Basics - Anfänger-Themen 4
M wie kann ich meine Projekte auf einen stick speichern? Java Basics - Anfänger-Themen 6
S Wie ist meine Strucktur Java Basics - Anfänger-Themen 11
F Eingabe darf nur 1 oder 0 sein. Meine Lösung macht Probleme. Java Basics - Anfänger-Themen 8
A Möchte Java - Chat in meine Homepage einbinden. Java Basics - Anfänger-Themen 4
M meine ersten versuche Java Basics - Anfänger-Themen 8
M wie pack ich das swt in meine *.jar Java Basics - Anfänger-Themen 8
S ich stör schon widr wegen meine gui Java Basics - Anfänger-Themen 2
R Welches inferface und somit welche IP benutzt meine JVM? Java Basics - Anfänger-Themen 2
M Meine Java Programm hägt durch waitFor() ! HILFE! Java Basics - Anfänger-Themen 10
G Meine erste IF Abfrage Java Basics - Anfänger-Themen 11
G wie meine java applikation installierbar machen? Java Basics - Anfänger-Themen 11
R BorderLayout macht meine Zeichnung kaputt Java Basics - Anfänger-Themen 14
A Parsen einer XML-Datei: Wo sind meine Start-Tags??? Java Basics - Anfänger-Themen 22
A Buttons für meine Homepage Java Basics - Anfänger-Themen 2
P meine java applets laufen nicht bei meinen freunden Java Basics - Anfänger-Themen 5
G Klassen: Wann initialisiere ich wo meine Variabeln Java Basics - Anfänger-Themen 6
K Mein Pc will meine Programme nicht kompilieren Java Basics - Anfänger-Themen 2
J Warum funktioniert meine Umwandlung nicht? Java Basics - Anfänger-Themen 3
G Public class??? Findet meine Klasse nicht. Java Basics - Anfänger-Themen 5
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
javalux123 Keylistener auf andere Fenster Java Basics - Anfänger-Themen 3
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
M KeyListener reagiert nicht Java Basics - Anfänger-Themen 4
M Mit KeyListener Farbe von Label ändern Java Basics - Anfänger-Themen 13
N Java Keylistener Java Basics - Anfänger-Themen 2
B KeyListener funkioniert nicht Java Basics - Anfänger-Themen 2
F KeyListener Java Basics - Anfänger-Themen 3
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben