Button während Thread aktiv ist disablen

xadoX

Aktives Mitglied
Hey Leute,

hab folgenden Code:

Java:
        Thread thread = new Thread(new Runnable() {
            public void run() {                
                verwaltung.getCategories();
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        verwaltung.getCategories2CS();
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                verwaltung.getAttributesCS();                              
                            }
                        });
                    }
                });
            }
        });        
        thread.start();
        while(thread.isAlive()){}
        jButtonOKProduktionsDaten.setEnabled(true);

Gewünscht ist, dass sobald der thread gestartet wird, der Button "jButtonOKProduktionsDaten" disabled wird und erst nach Beendung des Threads wieder enabled wird. Leider klappt das mit dem obigen Code nicht. Er bleibt die ganze Zeit sichtbar...
 
Zuletzt bearbeitet:
ein Schleife über die ganze Laufzeit ist doch Quatsch,
wozu überhaupt die Aktion nebenläufig ausführen wenn du den Aufrufer die ganze Zeit warten läßt?
der abschließende setEnabled(true);-Aufruf gehört an das Ende der run-Methode des Threads
 
Leider klappt das mit dem obigen Code nicht. Er bleibt die ganze Zeit sichtbar...
Steht ja auch nirgends was von setEnabled(false) ;-)
Was soll das mit dem invokeLater in invokeLater ?

Java:
new Thread(new Runnable() {
    public void run() {
        button.setEnabled(false);
        doWhatEverHasToBeDone();
        button.setEnabled(true);
    }
}).start();
 
Habs jetzt so und der Button wird zwar für ein paar Sekunden disabled, doch bevor alle anderen Methoden abgelaufen sind, ist er schon wieder enabled. Er soll aber so lange disabled sein, bis die drei Funktionen fertig sind.

Java:
Thread thread = new Thread(new Runnable() {
            public void run() {
                jButtonOKProduktionsDaten.setEnabled(false);
                verwaltung.getCategories();
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        verwaltung.getCategories2CS();
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                verwaltung.getAttributesCS();                             
                            }
                        });
                    }
                });
                jButtonOKProduktionsDaten.setEnabled(true);
            }
        });        
        thread.start();
 
was wird in
Code:
verwaltung.getCategories2CS()
und
Code:
verwaltung.getAttributesCS()
gemacht?

dein
Code:
jButtonOKProduktionsDaten.setEnabled(true);
muss momentan gleich nach
Code:
verwaltung.getAttributesCS()
aufgerufen werden.
 
In diesen Methoden werden u.a. Icons in eine JTable gesetzt. Damit diese Haken nacheinander gesetzt werden und nicht erst ganz am Ende, habe ich das mit invokeLater gemacht.
 
wenn die run-Methode von Zeile 11 im Posting von 15:36 am längsten läuft, dann muss dort eben der Befehl hin,
aber grundsätzlich widerspricht es dem Sinn der Sache, in invokeLater längerfristige Aktionen auszuführen,
auch dann die Frage: wozu überhaupt nebenläufige Threads?
 
Ok, scheinbar wußte ich nicht genau was invokelater macht. Habs jetzt so gelöst wie von euch gepostet:

Java:
Thread thread = new Thread(new Runnable() {
            public void run() {
                jButtonOKProduktionsDaten.setEnabled(false);
                verwaltung.getCategories();
                verwaltung.getCategories2CS();
                verwaltung.getAttributesCS();
                verwaltung.getAttributesXLS();
                verwaltung.getXTHersteller();
                verwaltung.getShopAttribute();
                verwaltung.getShopKategorien();                
                jButtonOKProduktionsDaten.setEnabled(true);
            }
        });        
        thread.start();

Danke, klappt wunderbar.
 
Vergiss das mit dem invokeLater und nimm lieber einen SwingWorker. Das verursacht auch gleich weniger Probleme mit Threading.
 

Zurück
Oben