2016-04-13 4 views
1

Ich habe eine knifflige Aufgabe in Java zu tun. Ich muss auf Mausklick mit dem Code reagieren, der als Lambda-Ausdruck übergeben wird (print 'ok' auf der Konsole) Das Problem ist, dass ich die Hauptklasse nicht ändern kann, ich muss die Klasse/Schnittstelle vorbereiten, um den Lambda-Ausdruck zu erhalten. Ich habe versucht, Tutorials auf Lambda-Ausdrücke zu folgen, aber ich bekomme immer Fehler über die Verwendung von nicht-funktionalen Schnittstelle. Main:Funktionale Schnittstelle in Java, um auf Mausklick zu reagieren

import javax.swing.*; 

public class Main { 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(()-> { 
     JFrame f = new JFrame(); 
     JButton b = new JButton("Mouse Click"); 
     b.addMouseListener ((MousePressListener) e -> System.out.println("ok")); 
     f.add(b); 
     f.pack(); 
     f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     f.setVisible(true); 
     } 
    ); 
    } 
} 

Könnten Sie Jungs mit mehr Erfahrung mir mit einigen Ratschlägen helfen könnten, wie könnte ich anfangen mit diesem Problem zu arbeiten? Ich begann mit einer Klasse zu schaffen, aber dann habe ich verloren (ich diese Klasse tat und ‚Geräte‘ so jetzt verwendeten Typ MousePressListener auch Mouselistener oder? Eingeben)

public class MousePressListener implements MouseListener { 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

} 

Antwort

3

Statt einer Klasse verwenden, um eine Schnittstelle mit Standard für alles Methoden außer mouseClicked:

@FunctionalInterface 
public interface MousePressListener extends MouseListener 
{ 
    @Override 
    default public void mouseEntered(final MouseEvent e) { 
    } 

    @Override 
    default public void mouseExited(final MouseEvent e) { 
    } 

    @Override 
    default public void mousePressed(final MouseEvent e) { 
    } 

    @Override 
    default public void mouseReleased(final MouseEvent e) { 
    } 
} 

so, jetzt MousePressListener ist eine Schnittstelle mit nur einem nicht-Standard-Methode als eine funktionale Schnittstelle erforderlich. Dies kann verwendet werden, ohne Ihre Klasse Main überhaupt zu ändern.

+0

Dank das ist genau das, was ich brauchte, – jawjaw

Verwandte Themen