2012-05-21 3 views
1

Следующий код просто отображает холст в окне, которое просто заполняет его содержимое красным. Однако при изменении размера окна он мерцает много, потому что перед каждой перерисованием холст, кажется, очищается. После небольшого тривиального поиска это, казалось, было потому, что метод update() назывался g.clearRect(), но теперь я его преодолел, и мерцание остается там, полотно все еще очищается до перерисовки.Остановить холст Java от очистки на перерисовке

Я играл с двойной буферизацией, и насколько я могу судить, что, похоже, не исправляет ситуацию - я не уверен, насколько это было бы полезно в любом случае, поскольку проблема, похоже, больше связана с предотвращением полотно от очистки до его перекраски.

Как и в сторону, прежде чем все врывается и говорит, я есть использовать Canvas в данном случае, не JPanel, потому что в другой момент времени, я использую тот же холст для нативного воспроизведения видео с VLCJ.

public class MyCanvas extends Canvas { 

    @Override 
    public void update(Graphics g) { 
     paint(g); 
    } 

    @Override 
    public void paint(Graphics g) { 
     //By the time we get here, the canvas has been cleared to its background colour 
     g.setColor(Color.RED); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     MyCanvas c = new MyCanvas(); 
     frame.add(c); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+0

Как вы реализовали двойную буферизацию? Я думаю, что это не должно рисовать белый прямоугольник, так как вы переопределили метод, вызывающий его ... Я пробовал код на своем компьютере, и он работает хорошо. – zeller

+0

@zeller Пробовал ли вы код как есть или без двойной буферизации? Я просто использовал тривиальный подход с заменой изображений поверх, а не встроенными в стратегии буферов, когда я его пробовал, но изменений не было. – berry120

+0

без двойной буферизации. Он мерцает, но не из-за рисования белого прямоугольника. Я думаю, вы должны попробовать встроенную буферную стратегию, вот это сообщение, которое может помочь: http://stackoverflow.com/questions/5924697/java-double-buffering – zeller

ответ

2

Двойная буферизация, как и ожидалось, оказалось не быть проблема - в любом случае полотно было очищено перед покраской из кода, который, казалось, глубоко в внутренностей библиотеки AWT.

После трассировки через соответствующие внутренности, то кажется, что поведение «ясно перед краской» может быть отменено свойством:

System.setProperty("sun.awt.noerasebackground", "true"); 

Добавления следующего остановил фон от стирания на холсте, прежде чем перекрашивать, и, следовательно, соответствующее мерцание.

Следует отметить, что это свойство, очевидно, является специфическим для Sun VM, поэтому не стоит думать, что вы получаете подобное поведение или нет на другой виртуальной машине. Однако он отлично работает для моего использования.