2012-03-01 2 views
1

Я создаю и обновляю BufferedImage в фоновом потоке. Изображение затем нарисовано на JPanel, переориентировав метод рисования панелей, как показано.Обновление буферизованного изображения из фоновой темы

@Override 
public void paint(Graphics g) { 
    g.drawImage(image, 0, 0, null); 
} 

Фоновая нить периодически обновляет изображение, а затем вызывает метод недействительности панелей.

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

Благодаря

Бен

+0

Это зависит, если вы рисуете (через AWT-поток) одновременно с обновлением изображения, тогда у вас есть проблемы. Синхронизация потоков. – Adrian

+1

Как в сторону, «программы Swing должны переопределять' paintComponent() 'вместо переопределения' paint() '." - [Живопись в AWT и Swing: методы Paint] (http://java.sun.com/products/ JFC/TSC/статьи/живопись/index.html # обратных вызовов). – trashgod

+1

1) В дополнение к тому, что упоминалось в trashgod, обратите внимание, что параметр 'null', переданный как последний аргумент' drawImage', является 'ImageObserver'. Поскольку 'JPanel реализует ImageObserver', это должно быть' g.drawImage (image, 0, 0, this); '. 2) Если вы не растягиваете изображение для заполнения этой панели или не добавляете другие компоненты сверху, я бы использовал 'JLabel', чтобы отобразить его. 3) Если растянуть изображение, но ** не ** накладывать компоненты, сделать в 'JComponent'. –

ответ

1

Две нити необходимо синхронизации доступа к общим данным. SwingWorker - самый надежный способ периодического опубликования BufferedImage; приведен пример here с использованием Double. Вы также можете посмотреть пример here, который опирается на (неявный) заказ, предоставляемый им EventQueue и repaint(). В любом случае ограничивающим фактором является частота таймера относительно времени перекраски.

+0

В результате я создал копию изображения в фоновом потоке. JPanel реализует интерфейс обратного вызова, который фоновый поток вызывает передачу копии. Затем JPanel использует 'SwingUtilities.invokeLater', чтобы установить JPanel в переменную и переименовать его самостоятельно. – benshort