[英]How to repaint a java.awt.Window?
為什么在調用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等。
我終於可以在Windows 7上運行代碼,並且可以復制該問題。 由於某種原因,沒有調用paint
。 為什么,我不知道。 因為我不會這樣做,所以我從來沒有遇到過這個問題。
相反,我將從計數器類從JPanel
或JComponent
擴展(只記得使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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.