2016-04-22 5 views
-1

Ich habe eine lange laufende Aufgabe (Drucken ganze Swing-Frame 9999 + mal). Leider läuft es nur im Ereignisversand-Thread gut. Also muss ich gui blockieren. Ich möchte dem Benutzer zumindest den Fortschritt zeigen. Mein erster naiver Versuch funktioniert nicht:Progressbar für lange Swing Event Dispatcher Thread Job

// this allo happens IN event dispatch thread 
for (int i = 0; i < 9999; i++) { 
    doLongEDTJob(i); 
    myProgressBar.setValue(myProgressBar.getValue() + 1); 
    myProgressBar.repaint(); 
} 

Was ist daran falsch? Es passiert einfach nichts.

upd: Hier Beispiel ist, dass das Problem illustarates:

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import javax.swing.*; 

public class Main { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     final int max = 40000; 
     final JPanel pp = new JPanel(); 
     final JProgressBar bb = new JProgressBar(); 
     bb.setMaximum(max); 

     BufferedImage img = new BufferedImage(1920, 1080, BufferedImage.TYPE_INT_ARGB); 
     final Graphics2D g2 = (Graphics2D) img.getGraphics(); 

     JButton b = new JButton(); 
     b.setAction(new AbstractAction() { 
      @Override 
      public void actionPerformed(final ActionEvent e) { 
       for (int i = 0; i < max; i++) { 
        pp.paintComponents(g2); 
        bb.setValue(i); 
       } 
      } 
     }); 

     b.setText("long EDT task"); 
     pp.add(bb); 
     pp.add(b); 
     frame.add(pp); 
     frame.pack(); 
     frame.setVisible(true); 

    } 
} 
+0

Bitte senden Sie Ihre [mcve] –

+0

............... ....Hallo? –

+0

@HovercraftFullOfEels hinzugefügt ein Beispiel. – AvrDragon

Antwort

1

Leider läuft es gut nur in Event Dispatch Thread. Also muss ich gui blockieren. Ich möchte dem Benutzer zumindest den Fortschritt zeigen.

Sie haben widersprüchlichen Anforderungen bekommen - wenn Sie den Ereignis-Thread mit einem langen laufenden Prozess blockieren, wird dies das Ereignis Thread Block von der Malerei und damit von der GUI-Aktualisierung - und so haben Sie ein XY Problem wo Sie fragen, wie Sie "X" lösen können, wenn die Lösung einen anderen Ansatz verwenden soll.

Die wirkliche Lösung für Ihr Problem ist, herauszufinden, warum Sie nicht in der Lage sind weg von der EDT die lang andauernden Aufgabe ausgeführt werden soll und dann die Aufgabe ändern, so dass es gut aus des Swing-Event Thread läuft, und dann, wenn dies erledigt ist, setze den Wert von JProgressBar auf den Ereignis-Thread, oft am besten mit einem SwingWorker. Für eine ausführlichere Antwort auf, wie dies zu tun ist, müssen Sie zeigen und veröffentlichen mehr, vorzugsweise eine Minimal, Complete, and Verifiable example

+0

Wie ich schon sagte: Die Natur einer langen Aufgabe ist es, Swing-Komponenten zu malen. Swing-Komponenten können nur in EDT durch Swing-Design korrekt lackiert werden. Das Verwenden eines Standardansatzes mit einer langen Task, die nicht in EDT ist, funktioniert in diesem speziellen Fall nicht. – AvrDragon

Verwandte Themen