2014-03-27 82 views
0

我有一個Swing的問題,我想了解paintComponent是如何工作的,我只是不明白爲什麼在這種情況下它會被調用兩次甚至三次(它似乎是隨機的給我打電話)。隨機調用paintComponent

package paintComponentTest; 

import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class UI { 

public static void main(String[] args) { 
    JFrame testFrame = new JFrame(); 

    TestPanel testPanel = new TestPanel(); 
    testFrame.setContentPane(testPanel); 

    testFrame.setSize(500, 500); 
    testFrame.setVisible(true); 
} 
} 

class TestPanel extends JPanel { 

@Override 
public void paintComponent(Graphics g) { 
    System.out.println("Called"); 
} 
}  

我的工作在不同的項目,我也的paintComponent被調用幾次,而我想它只能被稱爲一次,它阻止我前進。

提前致謝!

+1

關於「爲什麼」你只想要'paintComponent'被調用一次的信息,我會多走一步,以便能夠爲你提供解決問題的方法,因爲這不是繪畫的工作方式(或可以工作) – MadProgrammer

回答

3

基本上,繪畫不在你的控制範圍之內,你可以做很少的事情。

paintComponent被調用(間接地)時,重畫管理決定該組件需要被重畫,因爲一些事件,如作爲成分被調整(直接或因爲父容器中調整大小),或者它具有變得可顯示(現在可以在屏幕上看到或添加到可顯示的組件)以及任意數量的系統事件。

你需要做的第一件事(除了在你做任何自定義繪畫之前調用super.paintComponent之外)就是放棄你可能認爲你對繪畫過程有控制的錯覺。

接下來,您應該通讀Painting in AWT and Swing並瞭解繪畫過程的工作原理。

+0

謝謝你回答那麼快。 在我的'paintComponent'中進行重繪之前,我已經獲得了'super.paintComponent'。 事實是,我在我的'paintComponent'中做了一些處理,並且第一次被調用時我不能進行處理,因爲並不是所有東西都被創建出來了......我不會進入細節,但我必須等待我的JPanel「paintComponent」的第二個調用,否則它將無法工作。 因此,我有點用一個標誌來判斷我是否在第一次通話中,我覺得它很醜,但我不知道如何去做。 無論如何,謝謝我要讀這篇文章。 –

+0

解決方案可能是使用'BufferedImage'來繪製準備好的東西,然後在'paintComponent'方法中繪製'BufferedImage'。兩個原因。您獲得控制權並且繪畫應該儘可能快地完成,這將防止任何可能的滯後於您的應用程序響應... – MadProgrammer

+0

@ user2007740不應該有任何級別的處理**必須**僅在'paintComponent'中完成一旦。你應該能夠使用init方法和構造函數來讓你的「一次性」事情不受阻礙... – MirroredFate