如何重绘java.awt.Window?
How to repaint a java.awt.Window?
为什么我的 java.awt.Window 在调用 repaint() 方法后没有重新绘制?
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 方法每秒执行一次所以它实际上应该重新绘制 window... 所以我不不知道我哪里弄错了。
是的,我打算使用 awt.Window 而不是 JFrame 或 Frame 等。
我终于找到了 运行 Windows 7 上的代码,我可以重现这个问题。出于某种原因, paint
没有被调用;为什么,我不知道。因为我不会这样做,所以我从来没有遇到过这个问题。
相反,我首先让计数器 class 从 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();
}
}
为什么我的 java.awt.Window 在调用 repaint() 方法后没有重新绘制?
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 方法每秒执行一次所以它实际上应该重新绘制 window... 所以我不不知道我哪里弄错了。
是的,我打算使用 awt.Window 而不是 JFrame 或 Frame 等。
我终于找到了 运行 Windows 7 上的代码,我可以重现这个问题。出于某种原因, paint
没有被调用;为什么,我不知道。因为我不会这样做,所以我从来没有遇到过这个问题。
相反,我首先让计数器 class 从 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();
}
}