私はswingListを使用してコードを記述しました。これはactionListenerを追加するとprogressBarを更新しません。java swing progressBar
ボタンとアクションリスナーなしで、それは素晴らしい作品です。 progressBarの更新をできるだけ簡単かつきれいにする方法はありますか?添付されたコードは、私の問題を要約した分かりやすい例です。 ActionPerformedメソッドをコメントアウトしてmainからプログラムを実行すると、正常に動作します。
説明せずにコードを貼り付けるだけではありません。私はこれを見てきました。:
PSは: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();
}
}
これは一般的に同じ方法で解決される非常に一般的な問題です。この場合の最適な解決策は通常、[SwingWorker]を使用しています[例えば、](http://stackoverflow.com/questions/12020949/jprogressbar-isnt -progressing/12021971#12021971)。また、この問題の詳細については、[同時実行性(Concurrency in Swing)](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)を参照してください。ほとんどの場合、Swingはスレッドセーフではなく、UIを更新するために特別な注意を払わなければならないので、別の 'Thread'を使うことは最良の選択ではありません。SwingWorkerが自由にあなたに提供します; – MadProgrammer
@ MadProgrammer、 'この場合の最善の解決法は、通常SwingWorkerを使用しています...あなたはSwingのConcurrencyを見なければなりません。 – camickr
@camickr質問は終了する必要がありますが、私はあなたがそれをしている人に問題があることを知っているので、私はコメントを残しました(あなたの答えをサポートする)。 – MadProgrammer