Niestety LukaStrz nie masz racji.
Metody setValue i repaint można uruchamiać w innych wątkach niż swingowe.
Metoda repaint jedynie zleca przerysowanie, a nie wykonuje je od razu. Rysowaniem zajmuje się wątek AWT.
Aby się o tym przekonać najłatwiej dopisać wypisywanie wątku:
progressBar=new JProgressBar(){
@Override
public void paint(Graphics g) {
super.paint(g);
System.out.println("JProgressBar paint() thread=" + Thread.currentThread());
}
};
System.out.println("Invoking repaint thread=" + Thread.currentThread());
progressBar.repaint();
Rezultat:
Invoking repaint thread=Thread[Thread-3,6,main]
JProgressBar paint() thread=Thread[AWT-EventQueue-0,6,main]
Invoking repaint thread=Thread[Thread-3,6,main]
JProgressBar paint() thread=Thread[AWT-EventQueue-0,6,main]
Błąd natomiast jest gdzie indziej - metoda actionPerformed jest wykonywana przez wątek AWT i jeżeli będzie się ona długo wykonywać (tak, jak w tym przypadku), to trzeba wprowadzić dodatkowy wątek:
class MatrixFilterMenuItem extends JMenuItem{
private static final long serialVersionUID = 1L;
MatrixFilterMenuItem(String filterName,final int[][] matrix){
super(filterName);
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//wykonywane przez wątek AWT
new Thread(){
public void run() {
matrixFilter(matrix);
}}.start();
}
});
}
}