Я столкнулся с проблемой, связанной с моим классом Display, который расширяет Canvas. Один поток работает в одном и том же классе. В этом потоке вызывается метод repaint. Однако, несмотря на то, что поток работает нормально, метод рисования никогда не вызывается!
Вот мой код (я пропустил все, что не связано):
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
- person mKorbel   schedule 13.07.2011SwingUtils.invokeLater
, чтобы это было сделано в Swing EDT. Если вы делаете эти модификации в своем собственном потоке, Swing EDT никогда не узнает об этих модификациях; когда вы вызываетеrepaint
(который всегда запускается в Swing EDT, даже если вы вызываете его в своем собственном потоке), рисуются неизмененные значения BDisplay в памяти для Swing EDT. - person toto2   schedule 13.07.2011