从代码的外观来看,您正在阻塞事件调度线程 (EDT)。
EDT 负责(除其他外)处理重绘事件。这意味着如果您阻止 EDT,则无法重新绘制任何内容。
您遇到的另一个问题是,您不应该从除 EDT 之外的任何线程创建或修改任何 UI 组件。
查看Swing 中的并发以获取更多详细信息。
下面的例子简单地使用了 a javax.swing.Timer
,但是从事物的声音来看,你可能会发现Swing Worker更有用
public class TestLabelAnimation {
public static void main(String[] args) {
new TestLabelAnimation();
}
public TestLabelAnimation() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JLabel left;
private JLabel right;
public TestPane() {
setLayout(new BorderLayout());
left = new JLabel("0");
right = new JLabel("0");
add(left, BorderLayout.WEST);
add(right, BorderLayout.EAST);
Timer timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
left.setText(Integer.toString((int)Math.round(Math.random() * 100)));
right.setText(Integer.toString((int)Math.round(Math.random() * 100)));
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
}
}