【问题标题】:How to repaint a java.awt.Window?如何重新绘制 java.awt.Window?
【发布时间】:2016-07-19 00:29:26
【问题描述】:

为什么调用 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 等。

【问题讨论】:

  • 您确定正在调用您的 actionperformed 方法吗?在您的 println() 内部绘制打印您的时间变量以确保它正在更新
  • @GordonAllocman 是的,先生,调用了 actionperformed,我测试了它,时间也在计数 0,1,2,3....
  • 显式调用此组件的“无效”方法。这会强制重新绘制,因为会使整个容器无效(并强制重新布局其中的组件)。
  • @Jorge 不幸的是 invalidate() 没有效果,paint() 也不会在 invalidate() 之后调用。

标签: java user-interface awt frame


【解决方案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();
    }
}

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 2016-12-12
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2015-02-28
    相关资源
    最近更新 更多