Ich habe ein Problem: Ich will in meinem Programm beim Drücken eines Buttons einen Text in einer TextArea ausgeben:
Code:
public void b_update_ActionPerformed(ActionEvent evt) {
// TODO hier Quelltext einfügen
for (int i = 0; i < number; ++i) {
if (variableArt[i] == 1) {
name[1][i] = ("Hello World");
laenge = laenge + 23;
tA_quelltext.append("int "+name[i]+";\n");
}//end of b_update_ActionPerformed
Wenn ich diesen Button dann allerdings drücke, wird nicht "Hello World", sondern [Ljava.lang.String;@32703de6; a
Was macht denn die Methode b_update_ActionPerformed?
Ich kenne nur ActionPerformed vom ActionListener, aber nichts mit b_update_?
Hast du die selbst so definiert? Einfach um sie in der actionPerformed Methode des ActionListeners nochmal manuell aufzurufen, oder ist das eine Methode die von irgendwas automatisch aufgerufen wird?
Was macht denn die Methode b_update_ActionPerformed?
Ich kenne nur ActionPerformed vom ActionListener, aber nichts mit b_update_?
Hast du die selbst so definiert? Einfach um sie in der actionPerformed Methode des ActionListeners nochmal manuell aufzurufen, oder ist das eine Methode die von irgendwas automatisch aufgerufen wird?
Du kannst den ActionListener doch auf viele Arten einbauen:
Ein möglicher Schritt wäre z.B. ein Lambda Ausdruck oder du kannst da auch eine Methoden-Referenz übergeben.
Also in Code wäre das dann in etwas jeweils das Folgende:
Java:
// Dein Code Beispiel
b_update.addActionListener(newActionListener(){@OverridepublicvoidActionPerformed(Actionevent e){...}});// Lambda
b_update.addActionListener(e->{...});// Methodenreferenz
b_update.addActionListener(this::someMethod);
Oder einfach einmal in einem ganz kleinen übersetzbaren Beispiel (sehr unschön - um es ganz kurz zu halten viel static!)
Unter dem Strich geht es da bei allen Varianten um das Gleiche: Das Interface, das ActionListener fordert, wird implementiert. Da es nur eine Methode ist, spricht man auch von einem "functional interface" und da können dann Lambda Ausdrücke oder Methoden Referenzen zum Einsatz kommen.
Nur als kleiner Hinweis:
Den ganzen Block bei b_update.addActionListener kannst Du dir sparen und so wie in meinem Beispiel direkt schreiben: b_update.addActionListener(this::b_update_ActionPerformed);
Das ist deutlich kürzer und geht ab Java 8.
Oder wenn diese Methoden-Referenz nicht zusagt, dann würde ich es wenigstens als Lambda kürzen: b_update.addActionListener(evt -> b_update_ActionPerformed(evt));
Das verkürzt doch den Code ungemein und man hat ja in der Regel mehr wie eine Komponente dessen Events man verarbeiten möchte, so dass da bei Deine Schreibweise schnell sehr viele Zeilen Code zusammen kommen und da dann alles schnell unleserlich wird.
Oder hast Du einen GUI Builder im Einsatz, der dir so Code erzeugt hat?
Nur als kleiner Hinweis:
Den ganzen Block bei b_update.addActionListener kannst Du dir sparen und so wie in meinem Beispiel direkt schreiben: b_update.addActionListener(this::b_update_ActionPerformed);
Das ist deutlich kürzer und geht ab Java 8.
Oder wenn diese Methoden-Referenz nicht zusagt, dann würde ich es wenigstens als Lambda kürzen: b_update.addActionListener(evt -> b_update_ActionPerformed(evt));
Das verkürzt doch den Code ungemein und man hat ja in der Regel mehr wie eine Komponente dessen Events man verarbeiten möchte, so dass da bei Deine Schreibweise schnell sehr viele Zeilen Code zusammen kommen und da dann alles schnell unleserlich wird.
Oder hast Du einen GUI Builder im Einsatz, der dir so Code erzeugt hat?
Ich danke euch für die ausführlichen Erklärungen!
Dass der Actionlistener als functional interface auch so implementiert werden kann war mir gar nicht bewusst.