【发布时间】:2016-07-19 00:29:26
【问题描述】:
为什么调用 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 等。
【问题讨论】:
-
您确定正在调用您的 actionperformed 方法吗?在您的 println() 内部绘制打印您的时间变量以确保它正在更新
-
@GordonAllocman 是的,先生,调用了 actionperformed,我测试了它,时间也在计数 0,1,2,3....
-
显式调用此组件的“无效”方法。这会强制重新绘制,因为会使整个容器无效(并强制重新布局其中的组件)。
-
@Jorge 不幸的是 invalidate() 没有效果,paint() 也不会在 invalidate() 之后调用。
标签: java user-interface awt frame