Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ist es möglich eine Methode einer anderen Methode zu übergeben?
Wenn ja wie?
Mit Interfaces kann ich das nicht machen, weil die Methode die mitgegeben wird immer unterschiedlich ist (also unterschiedliche Parameter benötigt)
@Tarrew ich versteh dein Beispiel noch nicht so ganz...
Ich erklähr mal wofür ich das Brauche:
Ich will eine Tastatursteuerung für eine GUI machen, um per Shortcut's die GUI steuern zu können...
So sieht meine Methode für das erstellen von so einem Kürzel aus:
Java:
public void erstelleTastenkuerzel() {
erstelleVerhaltenFuerTaste(KeyEvent.getKeyText(KeyEvent.VK_F1), BenutzerdokuOeffnen());
erstelleVerhaltenFuerTaste(KeyEvent.getKeyText(KeyEvent.VK_ENTER), Speichern());
}
public void erstelleVerhaltenFuerTaste(String key, METHODE) {
((JComponent) panel).registerKeyboardAction(new ActionListener() {
public void actionPerformed(ActionEvent event) {
METHODE();
}
}, KeyStroke.getKeyStroke(key), JComponent.WHEN_IN_FOCUSED_WINDOW);
}
Das eigentlich Problem mittweile also eigentlich eher, wie ich meine Listner zum Speichern uä., die in eigenen Klassen liegen, und diverse Dinge mitgegeben bekommen (z.B. JTable, JComboBox, String, SelbergemachteFensterKlassen, ...) mit der METHODE verbinden kann...
EDIT: Ich glaube ich weiß selber noch nicht so genau wie das Funktionieren soll und muss erstmal meine Gedanken ordnen
Java 8 bietet sehr wohl Methodenreferenzen an. Wie bei Lambas ist dabei wichtig, dass die Methode, der mann eine weitere übergeben möchte ein mit als @FunctionalInterface markiertes Objekt entgegennehmen kann.
Funktionale Interfaces sind solche, die nur eine einzige Methode anbieten (siehe Link 1). Weitere im Link nicht beschriebene bereits existierende Interfaces wären Callable<T> oder Runnable. Du kannst aber auch schnell eigene Interfaces definieren und verwenden.
Mit einer Referenz á la "this::methodName" übergibst du nun die Methode an der Stelle, an der du das funktionale Interface verwendet hast. Etwas mehr Doku dazu im Link 2.
Link 3 ist noch einmal die formale Doku zu Lambdas. Da sie sich in der Anwendung überschneiden, empfehle ich, dir auch diese durchzulesen.
Bedenke aber, dass die Methoden BenutzerdokuOeffnen und Speichern wie ein ActionListener aufgebaut sein müssen. Das heisst, sie müssen den Parameter "ActionEvent e" besitzen.
@JCODA Funktioniert @dzim Da wird ein Fehler angezeigt, dass die Methode ein Object mitgegeben bekommen muss...
Wenn ich das aber mache, dann will er ein Funktionalles Interface... (Klappt also noch nicht )
Ich verstehe ehrlich gesagt nicht, wie das funktionieren soll. Du müßtest dann ja in deinem Listener alle Objekte zur Verfügung haben die alle Methoden, die aufgerufen werden können durch die Shortcuts, brauchen....
Deine Herangehensweise ist vollkommen verkehrt.
Du must deiner ShortCut Klasse zu einem Listener machen. Dann können sich alle Klassen deines Programmes die auf Shortcuts reagieren sollen an diesen Listener hängen und wenn ein Shortcur gedrückt wird, dann werden alle Klassen benachrichtigt welches Shortcur gedrückt wurde und die Klasse(n) die sich dafür zuständig fühlt führt dann die entsprechend zugewiesene Methode aus. Dadurch erhälst Du auch die für OOP geforderte Kapselung.
@Viktim - Ich bin aus Swing raus, kann dir nur sagen, dass ich in JavaFX und anderen Projekten dies schon häufig so gemacht habe. Ohne deinen Code rings herum zu kennen, wird es schwierig, genaueres zu sagen. Ausser eben: Es muss gehen.
Der ist zwar anders als der vorherige, geht aber trotzdem...
Ich ruf jetzt einfach einen KeyListner auf alle Textfelder auf, und nicht auf das große Oberpannel
Inwiefern sollten die helfen?
Der aufrufenden Code muss in jedem Fall eine implementierte - also nicht abstrakte - Methode aufrufen. Ob die abstrakt, in nem Interface, oder nur in der einen Klasse deklariert ist, muss egal sein.