Ich habe Code mit Swing-Libs geschrieben, dass, wenn ein Actionlistener hinzugefügt wird, eine Fortschrittsbalken nicht aktualisiert wird.Java Swing ProgressBar
Ohne einen Knopf und Aktion Hörer, funktioniert es gut. Wie erzwinge ich ein progressBar Update so einfach und sauber wie möglich? Angehängter Code ist ein leicht verständliches Beispiel, das mein Problem zusammenfasst. Wenn Sie eine ActionPerformed-Methode auskommentieren und das Programm von main aus ausführen, funktioniert das problemlos.
Fügen Sie nicht einfach den Code ohne Erklärung ein.
ps .: ich das gesehen habe: swing progressBar threading
public class Okno {
private JProgressBar progressBar = new JProgressBar(0,306);
JFrame f = new JFrame("JProgressBar Sample");
JButton b = new JButton("start");
ActionListener a = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
barupdate();
}
};
private void barupdate(){
for(int p = 1; p<308;p=p+2){
System.out.println(p);
progressBar.setValue(p);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private Okno(){
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
progressBar.setStringPainted(true);
f.add(progressBar, BorderLayout.SOUTH);
f.add(b, BorderLayout.NORTH);
b.addActionListener(a);
f.setSize(300, 300);
f.setVisible(true);
}
public static void main(String[] args) {
Okno okno = new Okno();
}
}
Dies ist ein sehr häufiges Problem, das in der Regel auf die gleiche Weise gelöst wird, die beste Lösung in diesem Fall ist normalerweise einen 'SwingWorker' zu verwenden, [zum Beispiel] (http://stackoverflow.com/questions/12020949/jprogressbar-isnt -progressing/12021971 # 12021971). Sie können sich auch [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) für weitere Details zu diesem Problem ansehen. In den meisten Fällen ist die Verwendung eines anderen 'Threads' an sich nicht die beste Wahl, da Swing nicht threadsicher ist und Sie zusätzliche Vorkehrungen treffen müssen, um die Benutzeroberfläche zu aktualisieren, die' SwingWorker' Ihnen kostenlos zur Verfügung stellt;) – MadProgrammer
@ MadProgrammer, 'die beste Lösung in diesem Fall ist normalerweise mit einem SwingWorker ... wyou sollte sich Concurrency in Swing ansehen,' - wünschte, ich hätte daran gedacht. – camickr
@camickr Die Frage sollte geschlossen werden, aber ich weiß, dass Sie Probleme mit Leuten haben, die das tun, also ließ ich meinen Kommentar (unterstützt von Ihnen beantwortet) und verließ – MadProgrammer