如何重绘java.awt.Window?

时间:2016-03-30 19:49:41

标签: java user-interface awt frame

为什么在调用repaint()方法后我的java.awt.Window没有重新绘制?

public class Counter extends Window implements ActionListener {

private static final long serialVersionUID = 1L;
private Timer timer;
private int time;

public Counter() {
    super(null);
    setAlwaysOnTop(true);
    setBounds(getGraphicsConfiguration().getBounds());
    setBackground(new Color(0, true));
    setVisible(true);
    timer = new Timer(1000, this);
    timer.start();
}

@Override
public void paint(Graphics g) {
    super.paint(g);
    g.clearRect(0, 0, getWidth(), getHeight());
    g.setColor(Color.RED);
    g.drawString(String.valueOf(time), getWidth()/2, getHeight()/2);
}

@Override
public void update(Graphics g) {
    super.update(g);
}

@Override
public void actionPerformed(ActionEvent e) {
    time++;
    repaint();
}

如你所见,我创建了一个延迟为1秒的计时器。之后我调用repaint()在屏幕上绘制计数器的数字。但它只在我的屏幕上绘制零并停止绘制(零停留在屏幕上)。首先我认为paint方法只被调用一次,但我测试了一个System.out.prinln(),并且证明了paint方法每秒执行一次,所以它应该重新绘制窗口...所以我不要知道我犯了什么错误。

是的,我打算使用awt.Window而不是JFrame或Frame等。

1 个答案:

答案 0 :(得分:2)

我终于在Windows 7上运行代码了,我可以复制这个问题。出于某种原因,paint没有被调用;为什么,我不知道。因为我不会这样做,所以我从未遇到过这个问题。

相反,我首先让计数器类从JPanelJComponent扩展(只需记住使JPanel透明),然后将其添加到{{1}这样的事情:

JWindow