2014-09-19 22 views
0

我目前正在學習Swing,並且遇到了一個心理障礙。我知道什麼時候我想繪製一個JPanel,我需要調用paintComponent方法。我已經閱讀了幾個邏輯不應該位於paintComponent塊內的地方。如果我想要一個定時器來確定什麼時候被繪製,我不需要從另一個類的另一個方法調用paintComponent並且創建該類的一個實例,該類還擴展了paintComponent中的JPanel?將邏輯集成到paintComponent中

我想我試圖避免的,是下面...

public void paintComponent(Graphics g) 
{ 


    super.paintComponent(g);  
    g.drawImage(blah,blah,blah); 

    if(timesUP==true){ 
    paintSomethingElse(g); 

    } 
    repaint(); 
} 

相反,我得到的印象,我應該對if語句的邏輯來創造一個完全不同的方法,並以某種方式從油漆單獨的方法。

我不理解什麼?

這已經被專門回答了嗎?我無法找到一個答案,這有助於我真正理解如何有效地將兩者分開,從而允許在同一個JPanel上繪製多個圖形。

+0

你想畫一些動畫?或者你想每隔一段時間用一個定時器改變圖像?你究竟想要做什麼? – 2014-09-19 07:24:48

回答

2

這取決於。如果邏輯與實際的繪畫過程有關,那麼沒有理由不能將它放入paintComponent方法中。

你想要避免的是將邏輯放在paintComponent中改變繪畫過程的狀態,因爲paintComponent可能由於許多原因而被調用,其中很多原因你無法控制。

paintComponent方法應該繪製組件的當前狀態,這一切,它不應該改變或更新狀態參與(這實際上可能導致一個無限重繪循環,這將消耗你的CPU週期)

+0

所以只要我不試圖遍歷paintComponent(或類似的)內的一些bufferedImage數組,我應該很好地使用if語句來..小樣說檢查一個計時器,然後在隨機點繪製一個橢圓在不同的方式下,屏幕會穿越屏幕。 – user3310769 2014-09-19 07:25:41

+0

它不會依賴計時器,我會依賴某種狀態或模型,它可以爲您提供更新當前狀態所需的信息。如果需要,模型可以在多個類中共享,並且某種觀察者模式甚至可以在修改時提供警報。 – MadProgrammer 2014-09-19 07:27:51

0

我還必須製作一個Java Swing應用程序,這個應用程序有很多繪畫要做--Janel必須繪製多個自定義組件,隨着用戶與它們交互,它們在屏幕上移動。

paintComponent方法是有繪圖,那應該是它的結束。只要你沒有等待條件,設置其他物體的狀態或任何可能一方面使你減慢很多並且另一方面讓你等待永遠不變的條件繪畫,在我的身邊,在paintComponent中是可行的。我在這裏稱之爲邏輯反應邏輯。

另一方面,不要忘記,重新繪製可以觸發外部,任何時候你可能需要它。通過這種方式,您可以在某種程度上將繪畫邏輯與繪畫分開使用監聽器,創建自己的事件,但保留paintComponent之外的動作邏輯。在進入繪畫之前,您可以輕鬆找到設置狀態的方法,這樣當您決定繪畫時,您只會對狀態做出反應。

不要忘記:如果您是多線程,如果您處理對象的半集狀態,繪畫可能會變得雜亂無章。 請仔細檢查!

0

如果邏輯非常複雜,可能是由paintComponent內致電(所有應用程序的GUI,而這種方法是運行停頓)太慢了,你應該定義一個單獨的update法制備預先計算的布爾標誌,座標,圖像和其他值,paintComponent可以用來快速生成最終視圖。

這樣的更新方法可以在單獨的線程中運行。您應該在本方法結束時致電repaint()或(如果佈局可能更改)invalidate()。爲所有準備好的值使用單獨的對象,並確保繪畫線程和更新線程不會訪問同一個實例。

如果邏輯速度夠快,我在paintComponent方法中定義它沒有問題。如果邏輯很複雜但仍然很快,可以用一些直接調用paintComponent的方法來定義它。