從你的代碼看起來,你是阻止事件調度線程(EDT)。
EDT負責(除其他事項外)處理重新繪製事件。這意味着如果你阻止美國東部時間,什麼都不能重新粉刷。
您擁有的另一個問題是,您不應該創建或修改除EDT以外的任何線程的任何UI組件。
查看Concurrency in Swing瞭解更多詳情。
以下示例僅使用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();
}
}
}
我沒有看到任何'JLabel'中的代碼。 downvote – 2013-02-13 10:19:47
正如我所提到的,我已經嘗試過Jlabel並且失敗了......所以我已經清理了所有Jlabel varibales – 2013-02-13 10:22:32
那麼,如果您清理了所有JLabel,那麼問題是什麼? – 2013-02-13 10:28:55