为什么在调用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等。
答案 0 :(得分:2)
我终于在Windows 7上运行代码了,我可以复制这个问题。出于某种原因,paint
没有被调用;为什么,我不知道。因为我不会这样做,所以我从未遇到过这个问题。
相反,我首先让计数器类从JPanel
或JComponent
扩展(只需记住使JPanel
透明),然后将其添加到{{1}这样的事情:
JWindow