Краткий ответ: не вызывайте super.paint()
в вашем методе Board.paint()
.
Длинный ответ: Апплет также является контейнером с собственными свойствами отображениявключая цвет фона, который вы устанавливаете с помощью setBackground(Color.WHITE);
как часть вашего конструктора.Вызывая super.paint(g)
, вы заставляете апплет закрашивать свой белый фон отображаемой графикой, а также вызываете рисование любого содержащегося компонента.Это является причиной мерцания - каждый цикл рисования, это рисование на экране белым цветом, а затем копирование вашего offscreenBuffer
изображения на экранном дисплее.
Вероятно, это лучше, чтобы быть явным, забудьтео фоне апплета удалите super.paint(g)
, и просто сделайте все шаги рисования самостоятельно.Вам нужно будет заменить clearRect()
на setColor()
и fillRect()
.
Также вам следует реализовать update()
.
@Override
public void update(Graphics g) { paint(g); }
@Override
public void paint(Graphics g) {
// no super.paint(g)
if (offScreenBuffer==null ||
(! (offScreenBuffer.getWidth(this) == this.size().width
&& offScreenBuffer.getHeight(this) == this.size().height)))
{
offScreenBuffer = this.createImage(size().width, size().height);
}
Graphics gr = offScreenBuffer.getGraphics();
// blank the canvas
gr.setColor(Color.WHITE);
gr.fillRect(0,0,offScreenBuffer.getWidth(this),offScreenBuffer.getHeight(this));
// paint the disks
paintDisks(gr);
// paint the curser ontop of the disks
paintCurser(gr);
g.drawImage(offScreenBuffer, 0, 0, this);
}