我想我可能在ubuntu 15.04下找到了openjdk-1.8.0_45的平台问题。以下程序编译并运行:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
public class TimerTime extends JPanel implements ActionListener
{
private JLabel timeLabel;
public TimerTime()
{
timeLabel = new JLabel( String.valueOf(System.currentTimeMillis());
add( timeLabel );
Timer timer = new Timer(50, this);
timer.setInitialDelay(1);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e)
{
//System.out.println(e.getSource());
timeLabel.setText(String.valueOf(System.currentTimeMillis()));
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("TimerTime");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new TimerTime() );
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
时间在视觉上每秒更新大约两次,直到发生任何类型的输入 - 鼠标移过它,它被拖动等等。然后它将以适当的速率更新,或者至少更快。这会在您的系统上发生吗?任何人都可以为这种行为提供解释或理论吗?如果我每次调用timeLabel
' setText()
时都会打印,我可以看到它每秒被调用大约20次,但尽管如此,实际的屏幕显示窗口每秒只更新两次,直到发生其他输入事件。
答案 0 :(得分:0)
为什么使用AWT而不是Swing?我会使用JFrame
你为什么要做自定义绘画?只需使用JLabel并将JLabel添加到JFrame,然后使用setText(...)
方法。不要重新发明轮子。
为什么使用Thread.sleep()。使用计时器。计时器用于安排事件。有关详细信息,请阅读How to Use Swing Timers上的Swing教程中的部分。
这是一个让你入门的完整示例:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
public class TimerTime extends JPanel implements ActionListener
{
private JLabel timeLabel;
public TimerTime()
{
timeLabel = new JLabel( new Date().toString() );
add( timeLabel );
Timer timer = new Timer(1000, this);
timer.setInitialDelay(1);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e)
{
//System.out.println(e.getSource());
timeLabel.setText( new Date().toString() );
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("TimerTime");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new TimerTime() );
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}