考虑到我的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.