MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt

Hag2bard

Bekanntes Mitglied
Ich habe eine Klasse die von JPanel erbt und momentan das MouseListener Interface implementiert.

Java:
public class TilePanel extends JPanel implements MouseListener {

Nun benötige ich aber nicht alle Methoden des Interfaces. Dafür wäre die MouseAdapter Klasse ja eigentlich gut geeignet.

Java:
    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("Mache irgendwas");
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

Wie man sieht, habe ich hier etliche Methoden implementiert, die ich nicht benötige. Aber ich erbe bereits von JPanel also fällt die Idee mit der MouseAdapter Klasse ins Wasser.
Wie kann ich die Implementierung der unnötigen Methoden umgehen?
Kann ich ein eigenes Interface schreiben mit default Methoden?

Danke im Voraus
 

httpdigest

Top Contributor
Kann ich ein eigenes Interface schreiben mit default Methoden?
Ja, das kannst du:
Java:
public interface MouseListenerWithDefaults extends MouseListener {
    default void mouseClicked(MouseEvent e) {}
    default void mousePressed(MouseEvent e) {}
    default void mouseReleased(MouseEvent e) {}
    default void mouseEntered(MouseEvent e) {}
    default void mouseExited(MouseEvent e) {}
}

public class TilePanel extends JPanel implements MouseListenerWithDefaults {
}
 

Hag2bard

Bekanntes Mitglied
Vielen Dank, das default wollte nicht funktionieren, da ich ein Semikolon statt den geschweiften Klammern benutzt habe, jetzt funktioniert es wie ich es möchte.
 

Neumi5694

Top Contributor
Erstell doch einfach eine innere Klasse, die von MouseAdapter ableitet (bzw. eine MouseAdapter-Variable, die die Methoden überschreibt), Problem gelöst und außerdem hast du die Methoden des Listeners vom Rest getrennt.
Dass ein Component gleichzeitig Listener ist, ist mittlerweile überholt. Früher hat man das oft so gemacht, aber spätestens seit Lambda macht das keiner mehr. Außerdem schützt das vor Missbrauch und Fehlern.
Nehmen wir mal an, deine Listener-Methdeon ändern etwas an der Komponente. Nun könntest du deine Klasse als Listener für eine andere Komponente verwenden. In diesem Fall würde sich der Listener nur selbst ändern, nicht aber die andere Komponente.
 

Jw456

Top Contributor
Das ist eine Lambda Expression keine innere Klasse.


Eine innere Klasse ist so was hier.

Java:
public class OuterClass {
    //.....
    
    class InnerClass {   
        public void print() {
            System.out.println("InnerClass");
        }
    }  //end InnerClass
    
} // end  OuterClass
 

Neumi5694

Top Contributor
Was meinst du mit innerer Klasse? Meinst du so was wie:

okButton.addKeyListener(e -> {
doSomething();
}
Das wäre ein Lambda Ausdruck, ersetzbar durch eine anonyme Klasse. Eine anonyme Klasse . würde auch funktionieren oder eben eine innere Klasse, wie sie jw4456 als Beispiel genannt hat. Es gibt da viele Möglichkeiten, welche dir deine Probleme ersparen .


Java:
//anonym ohne Hilfsvariable
void init() {
    a.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            //...
        }
    });
}

// Über lokale Variable oder Instanzvariable
void init() {
    a.addMouseListener(myListener);
}

MouseListener myListener = new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        //...
    }
}

//über innere Klasse

void init() {
    a.addMouseListener(new MyListener());
}

private class MyListener extends MouseAdapter {
    @Override
    public void mouseClicked(MouseEvent e) {
        //...
    }
}
 
Zuletzt bearbeitet:

Hag2bard

Bekanntes Mitglied
Und am gescheitetesten wäre die Variante mit der inneren Klasse?
Mir geht es nicht nur um die Übersichtlichkeit meiner Klassen, ich möchte mein Projekt so programmieren, dass ein erfahrener Programmierer drüber schaut und nichts zu beanstanden hat.
Ich bin auf jeden Fall immer für Kritik, Erklärungen und Verbesserungsvorschläge offen. Dass meine Klasse eine Erweiterung eines Listeners ist, habe ich nicht als Problem gesehen.
Ich habe z.b. eine Klasse die von JFrame erbt und das KeyListener Interface implementiert. Das Objekt dieser Klasse gebe ich mit Hilfe der addKeyListener sämtlichen Komponenten mit, die im JFrame "sitzen", damit ich beim Klick auf diese Komponenten weiterhin den Listener verwenden kann. Wieso macht man das nicht (mehr)?

Vielleicht bekomm ich es noch besser erklärt:

Der Keylistener ändert Felder der TilePanel Klasse. Muss der KeyListener in der TilePanel Klasse sein?
 
Zuletzt bearbeitet:

Neumi5694

Top Contributor
Und am gescheitetesten wäre die Variante mit der inneren Klasse?
Mir geht es nicht nur um die Übersichtlichkeit meiner Klassen, ich möchte mein Projekt so programmieren, dass ein erfahrener Programmierer drüber schaut und nichts zu beanstanden hat.
Ich bin auf jeden Fall immer für Kritik, Erklärungen und Verbesserungsvorschläge offen. Dass meine Klasse eine Erweiterung eines Listeners ist, habe ich nicht als Problem gesehen.
Ich habe z.b. eine Klasse die von JFrame erbt und das KeyListener Interface implementiert. Das Objekt dieser Klasse gebe ich mit Hilfe der addKeyListener sämtlichen Komponenten mit, die im JFrame "sitzen", damit ich beim Klick auf diese Komponenten weiterhin den Listener verwenden kann. Wieso macht man das nicht (mehr)?

Vielleicht bekomm ich es noch besser erklärt:

Der Keylistener ändert Felder der TilePanel Klasse. Muss der KeyListener in der TilePanel Klasse sein?

Dem erfahrenen Programmierer ist vor allem die Übersichtlichkeit wichtig :)
Guter Code ist solcher, den man Jahre später noch verstehen kann. Übersichtlichkeit und Dokumentation sind das A und O.

Jede der genannten Methoden funktioniert. Abhängig von der Länge des Codes des Mauslistener würde ich aber vom direkten Zuweisen einer anonymen Klasse absehen, da sonst die Übersichtlichkeit verloren geht.
Sofern nur einmal verwendet, würde ich also eine innere Klasse vorschlagen. Falls mehrfach vewendet, ist auch eine Instanzvariable ganz praktisch, da legt man den selben Schmuh nicht mehrmals an.


@Jw45 Für einen Mauslistener/Mausadapter wird Lambda aber leider nicht funktionieren, da er mehr als eine Methode hat.
 

Jw456

Top Contributor
Ich kenne keinen anderen Listener.

Aber mit einem Funktionalen Interface was die beiden nicht benutzen Methoden abdeckt (überschreibt) sollte es mit einem Lambda gen.


Java:
@FunctionalInterface
public interface KeyRealeasedListener extends KeyListener {
    @Override
    default void keyPressed(KeyEvent e) {
    }
    @Override
    default void keyTyped(KeyEvent e) {
    }
}

component.addKeyListener((KeyRealeasedListener) e -> System.out.println("key "));
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W AWT MouseAdapter und WindowAdapter AWT, Swing, JavaFX & SWT 6
K Probleme bei JLabel und MouseAdapter AWT, Swing, JavaFX & SWT 3
J JList + mouseadapter + popupmenue = problem AWT, Swing, JavaFX & SWT 4
H JList und MouseAdapter AWT, Swing, JavaFX & SWT 4
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
_user_q Versionscode aus build.gradle in Java-Klasse ausgeben lassen AWT, Swing, JavaFX & SWT 14
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
T JavaFX TableColumn in separate Klasse auslagern AWT, Swing, JavaFX & SWT 7
Monokuma KeyEvent in der Canvas Klasse AWT, Swing, JavaFX & SWT 0
B Was würden Profis an meiner Klasse verbessern? AWT, Swing, JavaFX & SWT 1
B JavaFX Verständnisfrage EventHandler<ActionEvent> Implementierung in meiner Klasse AWT, Swing, JavaFX & SWT 2
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
S Stream API, Anonyme Klasse AWT, Swing, JavaFX & SWT 8
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
L Javafx Controller Klasse in Maven AWT, Swing, JavaFX & SWT 7
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
J 2D-Grafik Background Image Klasse AWT, Swing, JavaFX & SWT 14
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
L JavaFX button über andere Klasse ändern AWT, Swing, JavaFX & SWT 7
K über Button andere Java Klasse aufrufen AWT, Swing, JavaFX & SWT 15
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
S per Button Variableninhalt aus anderer Klasse holen AWT, Swing, JavaFX & SWT 3
F AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen AWT, Swing, JavaFX & SWT 13
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L JavaFX Verbindung zwischen Beschreibung und Listener (Codebehind Klasse) AWT, Swing, JavaFX & SWT 4
J JTextfield automatisch aus zweiter Klasse aktualisieren AWT, Swing, JavaFX & SWT 5
J JavaFX Tableview Daten hinzufügen aus anderer Klasse AWT, Swing, JavaFX & SWT 7
Ghostman1711 GUI Java von Klasse mit Application Windows anderes Application Window aufrufen AWT, Swing, JavaFX & SWT 6
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
N JavaFX Erweitern der Line(Shape)-Klasse AWT, Swing, JavaFX & SWT 1
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
7 JavaFX Verwendung einer ResizableCanvas-Klasse in fxml-Datei AWT, Swing, JavaFX & SWT 3
A JavaFX Von Klasse auf Controller Inhalt zugreifen AWT, Swing, JavaFX & SWT 9
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
J JavaFX Mehrfache Benutzung von Methoden einer Klasse AWT, Swing, JavaFX & SWT 17
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
B Swing GUI in einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 4
B Klasse mit ArrayList AWT, Swing, JavaFX & SWT 1
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
L JavaFX Verständnisfrage zu JavaFX FXML und Controller-Klasse AWT, Swing, JavaFX & SWT 1
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
C JavaFX Zugriff auf TextField aus einer anderen Klasse AWT, Swing, JavaFX & SWT 4
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
D JavaFX Controller Klasse splitten? AWT, Swing, JavaFX & SWT 16
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
M Swing JTextField getText Mehtode übergeben in eine Klasse zu einer Rechnung AWT, Swing, JavaFX & SWT 1
M Panel in geerbter JFrame Klasse adden AWT, Swing, JavaFX & SWT 4
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
D AWT Das ganze GUI in eine Klasse? AWT, Swing, JavaFX & SWT 1
C JavaFX Klasse wird nicht als public erkannt AWT, Swing, JavaFX & SWT 6
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
V kann ich in einer Klasse stage und scene deklarieren, aber in anderen Klassen Inhalte hinzufügen ? AWT, Swing, JavaFX & SWT 5
V JavaFX, Pane construktor von einer Klasse in der Main verwenden. AWT, Swing, JavaFX & SWT 4
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
X buttons aus externe klasse lesen? AWT, Swing, JavaFX & SWT 3
D Swing JTable- Meine Tabelle der Klasse JTable wird nur bedingt angezeigt AWT, Swing, JavaFX & SWT 4
M Gui in einer anderen Java Klasse aufrufen AWT, Swing, JavaFX & SWT 1
A Problem mit JFrame in separater Klasse AWT, Swing, JavaFX & SWT 3
A Swing bei Auswahl und klick eines JComboBox buttons die Klasse eines anderen Projekts aufrufen AWT, Swing, JavaFX & SWT 3
C Swing MenuBar als eigene Klasse AWT, Swing, JavaFX & SWT 4
D Nächste GUI in einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 7
A Swing JTextArea aus anderer Klasse in realtime aktualisieren AWT, Swing, JavaFX & SWT 3
JavaInBrain Swing Rückgabe aus MouseListener-Klasse AWT, Swing, JavaFX & SWT 3
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
G JPanel aufrufen in andere Klasse AWT, Swing, JavaFX & SWT 2
G Window aus anderer Klasse aufrufen AWT, Swing, JavaFX & SWT 4
S klasse einbinden funktioniert nicht AWT, Swing, JavaFX & SWT 6
M JDialog übergibt eingaben nicht an aufrufende klasse AWT, Swing, JavaFX & SWT 15
B Zugriff auf JFrame obwohl die Klasse abgeleitet ist AWT, Swing, JavaFX & SWT 3
M Swing Array aus anderer Klasse AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben