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);
}
}
Bitte senden Sie Ihre [mcve] –
............... ....Hallo? –
@HovercraftFullOfEels hinzugefügt ein Beispiel. – AvrDragon