Aktion ausführen wenn Frame disposed wurde

Alex_99

Mitglied
Hallo, ich bin momentan dabei einen Taschenrechner mit History und GUI zu programmieren. Die History funktioniert soweit, nur bekomme ich es bislang nicht hin, dass die Aktion in der Klammer der Rechnerfunktion auf Anhieb durchläuft..

Rechnerfunktion:
showHistoryButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
History_GUI.main(null);
if (History_GUI.changeText == true){
Speicherfeld.setText(answer);
TextField.setText(null);
System.out.println("Aktion ausgeführt");
panel1.repaint();
History_GUI.changeText = false;
}
}
});
Historyfunktion:
loadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
set(null);
}
public void set(String[] args) {
String selected =list1.getSelectedValue().toString();
Rechner_GUI.answer = selected;
changeText = true;
}
});

Das Ziel ist, dass wenn der Load Button in der History Klasse geklickt wird und sich der Frame entsprechend schließt, der Wert an die Rechnerfunktion übergeben wird und sofort angezeigt wird. Leider führt er die Aktion erst dann aus, wenn ich erneut auf den ShowHistory Button im Rechner klicke, wenn der Frame aus der Historyfunktion disposed wurde.

Wie kann man das lösen und woran könnte es liegen?
 
Ich nehme an, dass History_GUI.main() einfach nur das neue Fenster öffnet. Da kannst Du aber doch nicht direkt weiter machen. Diese Oberflächen arbeiten ja Event-Orientiert und das musst du dann auch entsprechend abbilden. Was da halt passiert ist: Das Fenster wird geöffnet und direkt danach kommen die nächsten Anweosungen - ehe der User irgendwas machen konnte.

Was denkbar wäre: Es gibt modale Dialoge - wenn das andere also ein Dialog ist und dieser modal, dann würde man damit erzwingen, dass der User erst den Dialog beenden muss, ehe es weiter geht in der eigentlichen Ausführung.

Die Alternative ist, dass man mehrere Fenster hat und diese sich auch Events schicken können. Das wäre dann z.B. über das Oberserver Pattern machbar. Wenn man keine eigenen, neuen Interfaces haben will, dann wäre da auch PropertyChangeListener mit PropertyChangeEvent nutzbar.

Und täuscht der Eindruck oder hast Du da noch viel statische Elemente? Davon solltest Du weg kommen und statt dessen vernünftig mit Instanzen arbeiten.
 
Das mit den statischen Elementen werde ich noch anpassen.

Was ich gerade versuche ist das mit Threads zu realisieren. Leider jedoch auch ohne Erfolg.

Die Idee ist einen neuen Thread auszuführen und diesen dann zu beenden. Wenn der Thread beendet wurde soll der Code ausgeführt werden.

Rechner:

Code:
 showHistoryButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Thread t1 = new Thread();{
                        History_GUI.main(null);}
                t1.start();
                if (!t1.isAlive())
                {
                    if (History_GUI.changeText){
                        Speicherfeld.setText(answer);
                        TextField.setText(null);
                        System.out.println("Aktion ausgeführt");
                        panel1.repaint();
                        History_GUI.changeText = false;
                    }
                }
            }
        });

Historie:
Code:
loadButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                set(null);
            }
            public void set(String[] args) {
                String selected =list1.getSelectedValue().toString();
                Rechner_GUI.answer = selected;
                changeText = true;
                Thread.currentThread().interrupt();
                frame.dispose();
            }
        });

irgendeine Idee warum der Ansatz nicht funktioniert?
 
Also das wird noch dubioser. 🙂

Swing UI sollte komplett im UI Thread stattfinden. Da bringt es relativ wenig, weitere Threads zu erstellen. Und auch da ist mir unverständlich, was Du da versuchst:
  • Du startest den Thread
  • Direkt danach prüfst Du, ob dieser nicht mehr läuft?

Die zwei Ansätze, die Sinn machen könnten, hatte ich genannt:
a) ggf. modalen Dialog verwenden
b) Observer Patten (also das, was Du mit Events ja auch schon hast) um zwischen den Fenstern Daten auszutauschen.
 
Bin absoluter Anfänger und das ist mein erstes GUI Projekt 😀 Der Ansatz ist einen Thread zu erstellen und wenn auf load geklickt wird diesen zu schließen. Das Programm merkt das und führt den Code darunter aus 🙂
 
Diese GUIs sind in der Regel Event basiert und man sollte daher die eigene Applikation entsprechend aufbauen.

Also immer überlegen, was wann passieren soll. Der Benutzer macht etwas und darauf reagiert die Anwendung dann.

Und wenn man mehrere Fenster hat, dann sollte man diese entkoppeln. Aber das ist am Anfang evtl. schwer. Wenn das zweite Fenster etwas an das erste Fenster geben soll, dann kannst du da auch die Referenz übergeben. Also im Hauptfenster erstellst du das zweite Fenster und gibst dann eine Referenz vom Hauptfenster an das neue Fenster.
 

Neue Themen


Zurück
Oben