Java - 更新窗口叠加

时间:2015-10-10 18:15:18

标签: java user-interface paintcomponent

我想创建一个覆盖桌面并显示当前系统时间的透明窗口。我一直在尝试使用以下代码:

Window w=new Window(null)
{
  public void paint(Graphics g)
  {
      ...
  }
};
w.setAlwaysOnTop(true);
w.setBounds(w.getGraphicsConfiguration().getBounds());
w.setBackground(new Color(0, true));
w.setVisible(true);

但是,由于窗口只更新一次,我无法使用repaint()。我真的不明白这是如何工作的,我不知道如何在paint方法之外更新窗口组件。在绘制方法已经完成之前,窗口不会显示,然后我再也不能使用repaint()。我知道我在这里遗漏了什么,有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

无需进行自定义绘画。只需将JLabel添加到窗口,然后使用时间信息设置文本。

然后您可以使用Swing Timer来安排标签的更新。

简单示例:

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;
    private int count = 0;

    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() );
//      timeLabel.setText( String.valueOf(System.currentTimeMillis() ) );
        count++;
        System.out.println(count);

        if (count == 10)
        {
            Timer timer = (Timer)e.getSource();
            timer.stop();
        }
    }

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