2012-03-01 44 views
1

我在後臺線程上創建和更新BufferedImage。然後通過覆蓋如圖所示的面板塗料方法將圖像繪製到JPanel上。從後臺線程更新緩衝圖像

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

後臺線程定期更新圖像,然後調用面板invalidate方法。

我會遇到這種方法的任何問題嗎?擺動線程讀取和後臺線程更新映像是否會導致任何問題?

感謝

+0

它取決於,如果您在更新圖像時同時繪製(通過AWT線程),則會出現問題。線程同步。 – Adrian 2012-03-01 21:51:16

+1

另一方面,「Swing程序應該重寫'paintComponent()',而不是重寫'paint()'。」 - [在AWT和Swing中繪製:繪製方法](http://java.sun.com/products/) JFC/TSC /用品/繪畫/ index.html的#回調)。 – trashgod 2012-03-01 23:11:40

+1

1)除了trashgod提到的內容外,請注意,作爲'drawImage'的最後一個參數傳遞的'null'參數是'ImageObserver'。由於'JPanel實現了ImageObserver',它應該是'g.drawImage(image,0,0,this);'。 2)除非你拉伸圖像來填充該面板,或者在頂部添加其他組件,否則我會使用'JLabel'來顯示它。 3)如果拉伸圖像,但**不**疊加組件,則在'JComponent'中渲染。 – 2012-03-02 06:40:03

回答

1

兩個線程必須同步訪問共享數據。 SwingWorker是定期發佈BufferedImage最可靠的方法;有一個例子here使用Double。您也可以查看here示例,該示例依賴於EventQueuerepaint()提供的(隱式)排序。無論哪種情況,限制因素都是相對於重繪時間的計時器頻率。

+0

我最終做的是在後臺線程中創建映像的副本。 JPanel實現了一個後臺線程調用傳遞拷貝的回調接口。然後JPanel使用'SwingUtilities.invokeLater'將JPanel設置爲一個變量並調用它自己的重繪。 – benshort 2012-03-05 08:29:22