Java组件大多数时候都不更新

时间:2015-08-01 10:11:14

标签: java ubuntu graphics openjdk

我想我可能在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次,但尽管如此,实际的屏幕显示窗口每秒只更新两次,直到发生其他输入事件。

1 个答案:

答案 0 :(得分:0)

  1. 为什么使用AWT而不是Swing?我会使用JFrame

  2. 你为什么要做自定义绘画?只需使用JLabel并将JLabel添加到JFrame,然后使用setText(...)方法。不要重新发明轮子。

  3. 为什么使用Thread.sleep()。使用计时器。计时器用于安排事件。有关详细信息,请阅读How to Use Swing Timers上的Swing教程中的部分。

  4. 这是一个让你入门的完整示例:

    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();
                }
            });
        }
    }