java-为什么我的重画不起作用?

考虑到我的Display类(扩展了Canvas),我遇到了一个问题.
一个线程在同一类中运行.
在此线程中,将调用repaint方法.
但是,尽管线程工作正常,但永远不会调用paint方法!

这是我的代码(我忽略了所有不相关的内容):

package display;

public final class Display extends Canvas implements Runnable {
private static final long serialVersionUID = 1L;

private Frame frame;

private GraphicsEnvironment ge;
private GraphicsDevice gd;

public BDisplay() {     
    ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    gd = ge.getDefaultScreenDevice();

    frame = new Frame();

    //frame.setUndecorated(true);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setVisible(true);

    frame.add(this);

    frame.setLayout(null);

    //gd.setFullScreenWindow(frame);
}

@Override
public final void paint(Graphics g) {
    //THIS METHOD IS NEVER CALLED

    System.out.println("Paint method was called!");
    super.paint(g);

    //...
}

@Override
public synchronized void run() {
    while (isRunning()) {
        //THIS LOOP WORKS FINE.
        this.repaint();
    }
}
}

它与isRunning()之类的某些缺少的功能无关.
它们存在,我只是忽略了那些.

我以前从未偶然发现过这样的问题,
尽管我已经有一段时间没有使用SWING或AWT进行任何操作了.

有人可以帮忙吗?

线程循环工作正常,
但是重新粉刷似乎没有按计划进行…

解决方法:

在添加组件(即Canvas和以前的JPanel)之前,您已经实现了JFrame.

尝试这个

public BDisplay() {     
    ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    gd = ge.getDefaultScreenDevice();

    frame = new Frame();
    frame.setResizable(false);
    frame.add(this);
    //frame.setLayout(null); // Why are you using a null layout?
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

编辑

顺便说一句,我建议您使用JPanel而不是Canvas,因为不建议您混合使用重型和轻型组件.有关更多详细信息,请参见Mixing heavy and light components.

上一篇:Java 在Excel中添加水印(单一水印、平铺水印)


下一篇:java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operatio