あなたが望むものを達成する方法はたくさんあります。
克服しなければならない問題は数多くあります。1 つ目は、イベント ディスパッチ スレッドのコンテキスト内で、時間のかかるアクションやブロックするアクションを実行してはならないということです。そうすることで、とりわけ、Swing が再描画要求を処理できなくなります。
2 つ目は、EDT 以外のスレッドから UI コンポーネントを作成または変更してはならないということです。
最も簡単な方法は、javax.swing.Timer
. 別の手段は、 を使用することSwingWorker
です。
次の例は、疑似ランダム順序を定義する方法を示しています。
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestLabelDelay extends JFrame implements ActionListener {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
TestLabelDelay frame = new TestLabelDelay();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
private List<JLabel> labels;
public TestLabelDelay() {
super("Timer");
setLayout(new GridLayout(3, 3));
labels = new ArrayList<>(25);
for (int index = 0; index < 5; index++) {
labels.add(createLabel(index));
}
add(labels.get(0));
add(labels.get(1));
add(labels.get(2));
add(labels.get(3));
add(labels.get(4));
JButton show = new JButton("Show");
add(show);
show.addActionListener(this);
}
protected JLabel createLabel(int index) {
JLabel label = new JLabel(String.valueOf(index));
label.setVisible(false);
return label;
}
public void actionPerformed(ActionEvent a) {
List<Integer> order = new ArrayList<>(5);
order.add(2);
order.add(4);
order.add(0);
order.add(3);
order.add(1);
new ShowWorker(labels, order).execute();
}
public class ShowWorker extends SwingWorker<Void, Integer> {
private List<JLabel> labels;
private List<Integer> order;
private ShowWorker(List<JLabel> labels, List<Integer> order) {
this.labels = labels;
this.order = order;
}
@Override
protected void process(List<Integer> chunks) {
for (Integer index : chunks) {
JLabel label = labels.get(order.get(index));
label.setVisible(true);
label.repaint();
}
}
@Override
protected Void doInBackground() throws Exception {
for (int index = 0; index < labels.size(); index++) {
Thread.sleep(500);
publish(index);
}
return null;
}
}
}