Frage von Xehps2, 65

Ich habe ein Problem mit meinem Programm, woran ich arbeite. Ich verstehe nicht wieso der Konstruktor das JLabel nicht ausführt?

Im folgenden Programm verweis ich ganz unten im ActionListener(MeinListener4) auf den MeinFrame2 Konstruktor, damit ich die Variable "l" übergeben kann.

Jetzt will ich, dass im JLabel der "Text" "l" angezeigt wird. Leider tut er dies nicht :( Vielleicht hat einer von euch eine smarte Lösung.

Hier ist der Code : http://hastebin.com/ohinozojaj.java

Danke

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von KnusperPudding, Community-Experte für Java, 42

Das Problem besteht darin, dass du eine neue Instanz der Klasse erstellst und dort eine Variable setzt.

Und das wiederum machst du vermutlich, weil dein Listener static ist und somit keine Instanz-Referenz zu dem Rest deines Codes hat.

Kurzversion zur Problemlösung:

  1. Entferne den Konstruktor "MeinFrame2(double Zustellung)"
  2. Initialisiere das Label "Ergebnis" ohne Text und füge es an.
  3. Schreibe eine Methode: "setErgebnis".
  4. Erweitere den Konstruktor deines statischen Listeners um die Den parameter "MeinFrame2" und speichere die Variable dort in einer Instanz-Variable.
  5. Rufe in deinem Listener dann: "frame.setErgebnis()" auf und übergebe dorthin dein Ergebnis.

Anhand des Codes würde ich soweit abschätzen, dass du eventuell noch das ein oder andere Verständnis Problem zum Thema: Instanzen hast. Das soll nicht negativ gemeint sein, sondern viel mehr eine Anregung hierzu die ein oder andere Übung zu machen um ein besseres Verständnis dafür zu entwickeln.

Solltest du irgendwo noch Schwierigkeiten haben oder Fragen haben, kannst du diese gerne stellen.

Kommentar von Xehps2 ,

Tut mir leid für die späte Antwort. Ja das kein sein, dass ich Probleme mit Instanzen habe, ich lerne noch :).

So ich guck mir jetzt das Problem an, mal schauen ob ich es verstehe.

Kommentar von Xehps2 ,

Mhm... nach dem ersten Schritt kommen ich nicht ganz weiter. 

2. Soll ich bei 2 das Label "Ergebnis" definieren ? und wenn ja wo ?

4. Wie soll ich es erweitern ? ich kann doch in der Klasse kein Konstruktor einfügen der nicht den Namen "MeinListener4" trägt.

5.Ich weiß nicht ganz wo ich es aufrufen soll, aber diese Frage legt sich wenn ich 2 und 4 verstehe

Kommentar von KnusperPudding ,

2. Soll ich bei 2 das Label "Ergebnis" definieren ? und wenn ja wo ?

Deklarieren bei deinen anderen Feldern in MeinFrame2 und Initialisieren im Konstruktor, aber eben ohne Wert:

label = new JLabel();

anfügen mit add();

4. Wie soll ich es erweitern ? ich kann doch in der Klasse kein Konstruktor einfügen der nicht den Namen "MeinListener4" trägt.

Deshalb ja erweitern:

public MeinListener4(JTextfield zustellung, MeinFrame2 frame) {...}

Dadurch dass du nun die Referenz zu MeinFrame2 in deinem Listener hast, kannst du mit:

frame.setErgebnis();

arbeiten.

Kommentar von Xehps2 ,

Ich entschuldige mich für meine Unwissenheit !!! Ich bin nur so weit gekommen : http://hastebin.com/atejocaloz.java

Kannst du mir einfach mal einfach die nötigen Zeilen in den Code schreiben ? und dann schicken ?

ich weiß nicht mal ob ich mit dem Aufgeschriebenen nah an der Lösung dran bin :(

Ich versteh auch nicht von wo das "MeinFrame2 frame" geschickt wird, damit es in diesem Konstruktor aufgefangen wird.

Vielen Dank für die Hilfe 

Kommentar von Xehps2 ,

In meiner vorherigen Frage haben ich es auch durch den Quellcode begriffen und kann es jetzt auch gut anwenden.

Kommentar von KnusperPudding ,

Ich entschuldige mich für meine Unwissenheit !!!

Es war keineswegs feindlich gemeint. Falls es so angekommen ist, tut es mir leid.

Ich nutze die Zitat-Funktion um auf einzelne Stellen genauer einzugehen.

Bitte nim dir auch zu herzen, nicht zu viel Code in eine Methode zu packen, damit es übersichtlich bleibt.

In der Regel jedoch sollte es besser sein, keine Codebeispiele zu verwenden, wenn für die Lösung die Basics genutzt werden können, aber ich bin mal nicht so.

Kommentar von KnusperPudding ,

So einerseits konkret was ich gemeint habe:

http://hastebin.com/uxozafikif.java

und andererseits mal eine größere Umstrukturierung, wodurch vieles etwas lesbarer und leichter verständlicher wirkt:

http://hastebin.com/sanumacelo.java

Kommentar von Xehps2 ,

Nein, du hast mich keineswegs beleidigt, das war wegen dem dauerhaften Fragen stellen :) Also anders gesagt ich wollte mich entschuldigen, weil ich zum 2 mal deinen Ansatz nicht verstanden hab :)

Kommentar von KnusperPudding ,

Kein Problem. Ich hoffe du kannst etwas mit dem Ergebnis anfangen.

Kommentar von Xehps2 ,

Ja ich versteh es langsam. 

2 Fragen habe ich da noch  :

Was bedeutet """new MeinListener4(MeinFrame2.this, Preis));"""""

Also das was in Klammern ist, MeinFrame2.this, Preis.

Und was hat jetzt unten die Hauptklasse http://hastebin.com/ayesoviheg.cpp

damit zutun ? ich meine das Programm lief auch vorher ohne diese Zeilen.

Danke

Kommentar von KnusperPudding ,

this liefert immer die aktuelle Instanz zurück. - Wenn man nun eine Klasse hat, die an eine Instanz gebunden ist, wie hier.

private class MeinListener1 implements ItemListener

Würde

this

sich auf "

MeinListener1

" beziehen. - Damit aber genau klar wird, welches

this

gemeint ist, ist hier der Klassenname, der eigentlichen Instanz voranzustellen:

MeinFrame.this

2. Nachdem ich deine Hauptklasse nicht kenne, habe ich eine Main-Methode eingebaut, um dein Beispiel Testen zu können.

Kommentar von Xehps2 ,

Ok dann habe ich alles verstanden. Ich mache noch paar Übungen um alles eingeprägt zu bekommen.

Vielen Dank für den Aufwand, wie auch schon letztes mal qualitativ hochwertig ;)

Kommentar von KnusperPudding ,

Kein Problem, viel Spass!

Expertenantwort
von regex9, Community-Experte für Programmierung, 42

Naja, du erzeugst im ActionListener einen neuen Frame doch zeigst diesen nicht an. Du musst in dem aufgerufenen Konstruktor noch mindestens die setVisible-Methode aufrufen, um überhaupt das Fenster selbst sehen zu können.

Insgesamt solltest du deinen Code aufräumen und anfangen, sinnvolle, aussagekräftige Namen zu verteilen. Ein ActionListener4 sagt z.B. nicht wirklich aus, wofür die Klasse überhaupt da ist.

Kommentar von Xehps2 ,

wird nicht in diesem Fall ein neues Fenster geöffnet ? 

Kommentar von Xehps2 ,

entweder hast du mich nicht verstanden oder du hast das Problem nicht verstanden.

Kommentar von regex9 ,

Nein, die dritte oder vierte Option gilt: Du hast entweder deine Anforderungen nicht konkret genug definiert oder meinen Lösungsweg nicht verstanden. 😉
 

wird nicht in diesem Fall ein neues Fenster geöffnet ?

Nein, nur angezeigt. Das neue Fenster hast du mit deinem Konstruktoraufruf im Listener bereits erstellt. Die setVisible-Methode macht es lediglich noch sichtbar. Darin sollte sich dann dein befülltes Label befinden.

Wenn du hingegen das Label auf dem bereits angezeigten Frame befüllen lassen möchtest, musst du dem Konstruktor des Listeners bei Erstellen die Instanz des Frames übergeben. Der Listener speichert diese in ein eigenes Instanzattribut / Feld. Über die Instanz kannst du in der actionPerformed-Methode auf Eigenschaften des Frames zugreifen. Eigenschaften, auf die zugegriffen werden soll, müssen allerdings einen Getter oder den public access modifier besitzen. Ersteres wäre anzuraten.

Keine passende Antwort gefunden?

Fragen Sie die Community