Java AWT窗口没有重新绘制

时间:2015-07-06 14:22:36

标签: java awt repaint

我从窗口派生了一个类,但每当我调用setValue()(调用repaint)时,它都不会被重绘(调用该方法,但屏幕上没有任何变化)。绘制第一个值,默认为0。 这是班级:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.HeadlessException;
import java.awt.Window;

@SuppressWarnings("serial")
public class HashtagLikeDisplay extends Window {

    protected int count;

    HashtagLikeDisplay() throws HeadlessException {
        super(null);

        this.setAlwaysOnTop(true);
        this.setBounds(this.getGraphicsConfiguration().getBounds());
        this.setBackground(new Color(0, true));
        this.setVisible(true);
    }

    public void paint(Graphics g) {
        super.paint(g); // Doesn't matter if this is here or not

        Font font = getFont().deriveFont(48f);
        g.setFont(font);
        g.setColor(Color.RED);
        String message = "Total: " + Integer.toString(count);
        g.drawString(message, 10, 58);
    }

    public void update(Graphics g) {
        paint(g);
    }

    public void setCount(int c) {
        this.count = c;
        this.revalidate();
        this.repaint();
    }
}

为什么不能正确重新粉刷?

1 个答案:

答案 0 :(得分:2)

来自oracle docs

  

如果重新实现[update]方法,则应调用super.update(g)以便正确呈现轻量级组件。如果子组件被g中的当前剪切设置完全剪切,则update()将不会转发给该子组件。

另外,就像第一位评论者所说的那样,在paint()中调用super.paint(g)。

如果它仍然不起作用,你应该像使用JComponent而不是窗口一样使用Swing。

public class HashtagLikeDisplay extends JComponent{
...

protected void paintComponent(Graphics g) {
super.paintComponent(g);
// Customize after calling super.paintComponent(g)

Font font = getFont().deriveFont(48f);
g.setFont(font);
g.setColor(Color.RED);
String message = "Total: " + Integer.toString(count);
g.drawString(message, 10, 58);

}