2016-03-30 55 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