Warten auf Rückgabewert im EventDispatchingThread

Status
Nicht offen für weitere Antworten.
C

ChristianB

Gast
Hallo,

ich habe folgendes Code Besispiel:

Die folgende Methode wird im Zuge eines ActionPerfomed Events aufgerufen:

Code:
/**
*@return Returns if save operation is done correctly
*/
public boolean saveData(){
    boolean bRet = true;
    showSaveStateInfoDialog();     //NonModal Frame
    
    for(int xy = 0 ; xy < ITEMXYZCOUNT ; xy ++){
        bRet = bRet && saveItem(xy);
        setSaveStateInfoText("Saveing item " +  xy);
    }
    return bRet;
}

Das Problem ist, das die Swing Oberfläche jetzt nicht neu gezeichnet wird, da der EventDispatcher ja vor verlassen der Methode garnicht dazu veranlasst wird.

Ich habe auch schon einen Gedanken daran verschwendet die Sache in einen SwingWorker bzw. auch einen normalen Thread auszulagen, jedoch habe ich bisher keine Lösung wie ich in dieser Methode dann noch auf einen Rückgabewert warten kann ohne Swing gleich wieder auszubremsen.


Würde mich über gute Vorschläge freuen
Christian
 

Marco13

Top Contributor
"Warten"....? Welcher Thread soll "warten"? Hilft vielleicht die "publish"-Methode aus dem SwingWorker? Der SwingWorker workt in einem eigenen Thread, und veröffentlicht seine Zwischenergebnisse auf WUnsch im EDT....
 
C

ChristianB

Gast
Hi,

ich glaube um mein Problem verständlich rüber zu bringen poste ich hier mal einen Code schnipsel, der zwar funktional zeigt was ich will jedoch so nicht funktioniert.

Code:
/**
*This Method is an action Event Handler called by the EDT
*/
public void btnExitActionPerformed(Action a){
    if( saveData() ) exitProgram();
}

/**
*Return if save operation was successfull
*/
public boolean saveData(){
    Thread thSaver = new Thread(new Runnable(){
        public void run(){
            //-Do save oprations
            //-Update Gui with InvokeLaiter() (InvokeAndWait() end up in a DeadLock)
        }
    });
    thSaver.start();
    //Wait for completition
    while(thSaver.isAlive()){}
    return bResultFromThread;
}

Wie hier nun zu sehen ist benötige ich hier in einer Methode, die aus dem EDT aufgerufen wird und einen Rückgabeparameter liefert. Dieser Thread bzw. der SwingWorker wären alle beide super, wenn ich da nicht ein resultat benötigen würde. Ich habe leider keine andere Möglichkeit , da ich die Methode saveData() aus einem Interface implementieren muss. Die ActionPerformed Methode implementiere ich nicht selber.

Gruß Christian
 
S

SlaterB

Gast
die Abfrage
> if( saveData() ) exitProgram();
könnte an das Ende der run()-Methode?
dann musst du gar nicht den Rückgabewert erhalten usw. (edit: ok, ist vorgegeben)

----

statt
> while(thSaver.isAlive()){}
gibts noch
thSaver.join();

wenn aber die actionPerformed-Methode so lange warten muss, dann bringt ein Thread gar nix

---

hilfreich wäre da vielleicht nur, wenn generell ein Thread parallel zur GUI läuft und jederzeit bzw. zu jeder freien Zeit das save() soweit wie möglich vorbereitet hat,
dann kann bei einem save-Klick die save-Aufgabe möglichst schnell abgeschlossen werden

-----

bei einem Button, der das Programm recht bald beendet, ist Nebenläufigkeit eh weniger wichtig,
wer will schon nach dem Klick auf Exit noch irgendeine andere Aktion starten? ;)

auch saveData() allgemein klingt eher nach etwas, wo maximal ein 'Bitte warten' zu sehen ist,
aber auch da sollten keine anderen Aktionen möglich sein müssen,

tja, hast du wohl auch schon, bis auf Änderung dieser Nachricht,
ich sehe jedenfalls keine Möglichkeit, wenn die ActionPerformed so ungünstig vorgegeben ist

oder ist es nicht so, dass bei Anzeige eines Dialoges der ActionListener unterbrochen wird?
wenn man darin etwas aus einer ComboBox auswählt, wird doch auch neu gezeichnet..,

teste mal Starten eines Thread + (danach!) modaler Dialog
 
S

SlaterB

Gast
muss ich nun auch mal selber wissen ;) :
Code:
public class TestGUI
    extends JFrame
{
    public TestGUI()
    {
        JButton b = new JButton("Start");
        b.addActionListener(new ActionListener()
            {

                public void actionPerformed(ActionEvent e)
                {
                    if (saveData())
                    {
                        System.exit(0);
                    }
                }

                private boolean saveData()
                {
                    final JTextField tf = new JTextField();
                    tf.setText("-1");

                    final JDialog d = new JDialog(TestGUI.this, true);
                    d.setSize(300, 300);
                    d.setLocation(300, 300);
                    d.add(tf);
                    
                    Thread thSaver = new Thread(new Runnable()
                        {
                            public void run()
                            {
                                for (int i = 0; i < 5; i++)
                                {
                                    try
                                    {
                                        Thread.sleep(1000);
                                    }
                                    catch (InterruptedException e)
                                    {
                                        e.printStackTrace();
                                    }
                                    tf.setText("" + i);
                                }
                                d.dispose();
                            }
                        });
                    thSaver.start();

                    
                    d.setVisible(true);
                    System.out.println("a");
                    return true;
                }
            });

        add(b);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200, 200);
        setVisible(true);
    }

    public static void main(String[] args)
        throws Exception
    {
        new TestGUI();
    }
}
 
C

ChristianB

Gast
Hi SlaterB,


deine Version läuft auch bei mir. Aber müssten nicht eigentlich deine *.setText("") aufrufe in einem InvokeLater Aufruf stehen?
Was damit dann leider nicht mehr funktioniert.

(Es neigt sich alles dem Guten)

Gruß Christian
 

Verjigorm

Top Contributor
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/JTextComponent.html#setText(java.lang.String)

API hat gesagt.:
This method is thread safe, although most Swing methods are not. Please see Threads and Swing for more information.
 
C

ChristianB

Gast
Dann ist ja alles super!

Das ist eigentlich genau die Lösung die ich dann gebraucht habe!

Vielen Dank sann mal an alle

Gruß Christian
 
S

SlaterB

Gast
invokeLater geht bei mir übrigens auch, was zum 'repaint ist noch möglich'-Gedanken passt,

scheiterst du vielleicht nur daran, dass die Variable i nicht final ist?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards JavaFX Background Task warten auf Knopfdruck AWT, Swing, JavaFX & SWT 4
G FX warten bis ein anderes GUI Element ausgewählt wurde AWT, Swing, JavaFX & SWT 8
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
kodela Swing Anzeige des Warten-Cursors AWT, Swing, JavaFX & SWT 8
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
W JavaFX Webview warten bis Seite geladen geladen ? AWT, Swing, JavaFX & SWT 0
U Java FX Warten auf Textfield eingabe AWT, Swing, JavaFX & SWT 17
M JavaFX FadeTransition, warten bis beendet AWT, Swing, JavaFX & SWT 10
O Swing JDialog öffnen und dann warten bis er geschlossen wurde AWT, Swing, JavaFX & SWT 2
H Event Handling JavaFx - auf Event warten AWT, Swing, JavaFX & SWT 4
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
D Swing Bei MenuSelectionManager auf Ausführung warten? AWT, Swing, JavaFX & SWT 5
gamebreiti auf usereingabe warten mit GUI(nur Labels, Buttons etc. keine Texteingaben) AWT, Swing, JavaFX & SWT 3
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
H AWT Auf Bestätigung warten AWT, Swing, JavaFX & SWT 6
B Timer, TimerTask und Warten AWT, Swing, JavaFX & SWT 4
L JavaFX Wait/Sleep/postedDelay - Einfach nur warten AWT, Swing, JavaFX & SWT 4
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
F JFrame nach Buttonklick 3 Sekunden warten, bevor es sich ändert AWT, Swing, JavaFX & SWT 2
C Schleife auf Mausklick warten lassen AWT, Swing, JavaFX & SWT 6
A Auf Tastendruck warten AWT, Swing, JavaFX & SWT 9
A Auf eingabe warten AWT, Swing, JavaFX & SWT 5
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
B Warten bis neues ImageIcon zugewiesen ist AWT, Swing, JavaFX & SWT 3
S Swing Bild (Gif) in Bitte warten JDialog AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
M Hauptprogramm pausieren und auf Ergebnis eines JDialogs warten AWT, Swing, JavaFX & SWT 7
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
A Swing Warten bis JDialog fertig AWT, Swing, JavaFX & SWT 3
T Auf Ende von mehreren Threads warten, ohne den EDT zu blockieren AWT, Swing, JavaFX & SWT 1
pinerski Swing Frame 1 soll auf Frame 2 warten AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
R JDialog "Bitte warten..." durchsichtig AWT, Swing, JavaFX & SWT 5
G JTable warten bis Spalte verschoben wurde AWT, Swing, JavaFX & SWT 2
A Bitte warten Dialog AWT, Swing, JavaFX & SWT 4
G Auf Ergebnis vom Thread warten AWT, Swing, JavaFX & SWT 3
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2
R Warten auf Ergebnisse eines untergeordneten JFrame AWT, Swing, JavaFX & SWT 2
C Auf Ereignis warten AWT, Swing, JavaFX & SWT 7
L Warten, aber trotzdem "lebende" UI AWT, Swing, JavaFX & SWT 2
K Textfeld Programm soll auf Eingabe warten! AWT, Swing, JavaFX & SWT 4
B Auf Frame/Dialog warten AWT, Swing, JavaFX & SWT 2
A Programmunterbrechung und warten auf Benutzereingabe AWT, Swing, JavaFX & SWT 6
J Warten auf einen Dialog? AWT, Swing, JavaFX & SWT 2
J Programm warten, bis GUI geschlossen ist AWT, Swing, JavaFX & SWT 4
F Auf Thread warten ohne alles andere zu blockieren AWT, Swing, JavaFX & SWT 5
W Auf eine Eingabe warten? AWT, Swing, JavaFX & SWT 2
N malen => 1 Sekunde warten => malen AWT, Swing, JavaFX & SWT 2
m@nu Dialog während warten anzeigen AWT, Swing, JavaFX & SWT 3
U Auf Swings Reaktion warten AWT, Swing, JavaFX & SWT 3
C JFrame warten lassen AWT, Swing, JavaFX & SWT 11
kodela Falscher Rückgabewert AWT, Swing, JavaFX & SWT 12
B Swing Windowbuilder Rückgabewert im Event AWT, Swing, JavaFX & SWT 3
J Action Listener Rückgabewert AWT, Swing, JavaFX & SWT 14
S Swing Eigenen JDialog mit Rückgabewert AWT, Swing, JavaFX & SWT 3
A Swingworker rückgabewert verwenden AWT, Swing, JavaFX & SWT 9
J Swing JDialog mit static-Funktion anzeigen -> Rückgabewert AWT, Swing, JavaFX & SWT 3
L Rückgabewert aus Klasse mit JDialog AWT, Swing, JavaFX & SWT 6
GilbertGrape Wie komm ich an Rückgabewert des SwingWorkers? AWT, Swing, JavaFX & SWT 6
R Rückgabewert TreeSelectionListener für JInternalFrame AWT, Swing, JavaFX & SWT 4
A showConfirmDialog (Rückgabewert abfragen?) AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben