2016-03-30 142 views
0

为什么我调用repaint()方法后,我的java.awt.Window没有重绘?如何重新绘制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或逐帧等。

+0

确定你的actionperformed方法被调用?在你的println()里面的油漆中打印你的时间变量,以确保它正在被更新。 –

+0

@GordonAllocman是的先生,actionperformed被调用,我测试了它,时间也在计数0,1,2,3 .... – AvarionDE

+0

明确调用该组件的“无效”方法。这迫使重绘,因为整个包含器无效(并强制重新布局组件)。 – Jorge

回答

1

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

相反,我会通过使计数器类从东西JPanelJComponent延长启动(只记得,使JPanel透明),然后将其添加到JWindow,是这样的:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.Timer; 


public class Counter extends JPanel implements ActionListener { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JWindow window = new JWindow(); 
       window.add(new Counter()); 
       window.pack(); 
       window.setLocationRelativeTo(null); 
       window.setBackground(new Color(0, 0, 0, 0)); 
       window.setVisible(true); 
      } 
     }); 
    } 

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

    public Counter() { 
     setOpaque(false); 
     timer = new Timer(1000, this); 
     timer.start(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(200, 200); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); //To change body of generated methods, choose Tools | Templates. 
     System.out.println(time); 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.RED); 
     g.drawString(String.valueOf(time), getWidth()/2, getHeight()/2); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     time++; 
     System.out.println("..." + time); 
     repaint(); 
    } 
} 
+0

非常感谢!工作正常! – AvarionDE