Hallo 
Ich schreibe gerade ein Java-Programm und habe ein grundsätzliches
Problem mit einem dynamisch erzeugten ActionListener.
Also:
In meiner Swing-Applikation sind Eingabefelder und ein JButton
„berechnen“. Außerdem gibt es noch einen JButton „Zeigen“, der
aber auf setVisible(false) gesetzt ist. Beim Start der Applikation
ist der „Zeigen“-Button also nicht sichtbar.
Klickt man auf „berechnen“, werden die Werte aus
den Eingabefeldern genommen und mit der Funktion „pruefen()“ auf
Gültigkeit geprüft. Sind die Werte okay, wird die Funktion
„berechnen()“ aufgerufen. In einem JLabel in der Swing-Oberfläche
wird dann das Ergebnis angezeigt. Zusätzlich wird jetzt der
„Zeigen“-Button auf setVisible(true) gesetzt und ihm wird ein
ActionListener verpasst, dem 3 dynamisch erzeugte Werte übergeben
werden. Der ActionListener soll ein neues Fenster öffnen, in dem
diese 3 Werte grafisch dargestellt werden. Deswegen heisst der
ActionListener „Darsteller“ (also ich habe eine weitere Klasse
namens „Darsteller“).
Nun kommt mein Problem:
Wenn ich zum ersten Mal auf „berechnen“ klicke, läuft alles
wunderbar, das neue Fenster geht auf. Klicke ich noch einmal
auf „berechnen“, gehen 2 neue Fenster auf. Klicke ich noch einmal
auf „berechnen“, gehen 3 neue Fenster auf, usw. Der JButton hat jetzt
also 3 ActionListener (bzw. so viele je nachdem wie oft ich auf
den „berechnen“-Button klicke), obwohl er nur einen haben soll.
Ich muss diesen ActionListener aber in der Funktion „berechnen()“
erzeugen, weil ich erst hier Werte zur Übergabe habe.
Ich kann den Listener also noch nicht in er Oberfläche an den JButton
hängen!
Ich habe auch schon versucht, den ActionListener über
removeActionListener(…) erst wieder zu entfernen und dann wieder
mit addActionListener(…) die neuen Werte zu übergeben, der alte
ActionListener wird aber irgendwie nicht gelöscht.
Hier mal beispielhaft das Programm, falls jemand nicht verteht was ich
meine:
import ...;
class Test extends JFrame
{
private Darsteller darsteller;
public Test()
{
// Erzeugung der Oberfläche mit Eingabefeldern usw.
...
JButton btnRechnen = new JButton("berechnen");
btnRechnen.addActionListener(.....); // ruft pruefen() auf
...
JButton btnZeigen = new JButton("zeigen");
btnZeigen.setVisible(false);
...
}
public void pruefen()
{
int x1, x2, x3;
...
// Wenn alle Eingaben gültig
berechnen(x1, x2, x3); // x1,x2,x3 haben hier gültige Werte
}
public void berechnen(int p1, int p2, int p3)
{
int wert1, wert2, wert3;
// eine Berechnung mit den übergebenen Parametern p1,p2,p3
...
// wert1,wert2,wert3 haben hier Werte, die grafisch darstellbar
// sein sollen. Der "Zeigen"-Button wird also sichtbar gemacht
// und bekommt den ActionListener mit den aktuellen Werten
btnZeigen.removeActionListener(darsteller);
darsteller = new Darsteller(wert1,wert2,wert3);
btnZeigen.addActionListener(darsteller);
btnZeigen.setVisible(true);
}
}
Hat jemand eine Idee, was ich falsch mache?
Oder gibt es eine Lösung, den ActionListener zwar in der Oberfläche
zu erzeugen (z.B. mit Dummy-Werten, der Button ist beim Start ja eh
nicht sichtbar), und dann in Funktion berechnen() diesem trotzdem
dynamisch Werte mitzugeben?
Über Hilfe / Denkanstöße würde ich mich freuen 
mfG PoiSoN