двойная буферизация и рисование

Я использую как двойную буферизацию, так и события Swing, которые, похоже, конфликтуют. Я использую JSlider и пытаюсь удвоить буфер. На самом деле это двойная буферизация, но двойная буферизация снова рисуется, и я теряю свое изображение. Я использую JSlider для рисования с двойной буферизацией, и система событий, похоже, перерисовывает кадр (с двумя компонентами, изображением и ползунком). Как мне сделать это правильно? Я попытался установить переменную перерисовки, чтобы сигнализировать о том, чтобы не перерисовывать компонент, но это не работает. Есть ли какой-то переключатель событий, чтобы остановить перерисовку определенных компонентов? Должен ли я не использовать двойную буферизацию? Вот фрагмент кода.

private void drawOneByOne(ImageComponent imgComponent, JFrame f,
        MapObjects mapObjects, int number) {
    f.createBufferStrategy(2); 

    BufferStrategy bufferStrategy = f.getBufferStrategy();
    Graphics2D g = (Graphics2D)bufferStrategy.getDrawGraphics();            
    bufferStrategy = f.getBufferStrategy();
    g = (Graphics2D)bufferStrategy.getDrawGraphics();
    // draw the map and then the points
    imgComponent.paint(g);
    for (int i = 0; i < number; i++) {
        imgComponent.drawPoint(mapObjects.get(i),g);
    }
    imgComponent.repaint = false;
    bufferStrategy.show();
    g.dispose();
    imgComponent.repaint = true;
}
public void stateChanged(ChangeEvent e) {
    JSlider source = (JSlider)e.getSource();
    if (!source.getValueIsAdjusting()) {
        int voterNumber = source.getValue();
        System.out.println("Drawing One By One, " + voterNumber);
        drawOneByOne(this.imgComponent, this.f, this.mapObjects, voterNumber);
    }
}

. . .


person John Byrne    schedule 09.06.2013    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 09.06.2013


Ответы (1)


Swing легко двойная буферизация через setDoubleBuffered(true), если это все, чего вы хотели добиться. В двойной буферизации нет ничего плохого, она просто использует больше памяти, вызывайте ее в родительском контейнере ваших компонентов свинга. У вас нет контроля над repaint, ОС вызывает его всякий раз, когда сочтет это необходимым, если только вы не вызовете setIgnoreRepaint в JFrame.

person arynaq    schedule 09.06.2013
comment
Я думал, что по умолчанию для всех дочерних элементов JComponent установлено значение true. - person Hovercraft Full Of Eels; 09.06.2013
comment
Компоненты Swing наследуют двойную буферизацию от родительского контейнера. Поскольку по умолчанию корневая панель имеет двойную буферизацию, все компоненты имеют двойную буферизацию. - person camickr; 09.06.2013
comment
Моя информация тогда устарела, хотя должен был знать, никогда не замечал мерцания на компонентах качания. - person arynaq; 10.06.2013