2013-06-03 106 views
2

我試圖根據paint()paintComponent()方法中的一些計算繪製和繪製一些幾何形狀。但是,我意識到paint()paintComponent()內的打印和其他計算語句執行2次或有時3次。例如在下面的代碼打印語句執行兩次,「幫助」一詞在控制檯打印了兩次:爲什麼語句在paint或paintComponent方法中多次執行?

public class Skeleton extends JPanel { 
public void paint(Graphics g){ 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.drawOval(50, 50, 100, 100); 
    System.out.println("help"); 
} 

,然後在控制檯打印的部分是這樣的:

help 
help 

這裏是我main()方法

public static void main(String[] args) { 

    JFrame frame = new JFrame("Java 2D Skeleton"); 
    frame.add(new Skeleton()); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(870, 890); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

更糟的是,如果我有一個類的公共變量,我通過1內增加其價值方法。這導致值增加2. 我已經讀過這個網站的某個地方,方法paint()自動調用其他三種方法,這是他們導致這個問題的原因。 另外我也嘗試了一些建議的解決方案在另一個網站上,以覆蓋方法paintComponent()而不是方法paint()。但是我仍然有同樣的問題。 請幫我修復它。

回答

2

你是重寫paintComponent而不是paint的權利。我認爲這裏的問題是paintComponent應該做一件事,繪製你的組件。任何數量的東西都會導致調用repaint(),這會調用你的paintComponent,所以它不能保證此方法執行的時間和頻率。進行計算並記錄變量應該可以作爲單獨模型類的一部分,您的組件可以查看該模型類以瞭解要繪製的內容。

+0

感謝您的響應,但我需要它根據一些變量的值和計算繪製形狀。此外,我需要根據形狀位置調用其他方法來完成其他人員。如果適用的話,可能的解決方案是用不同的方法進行計算,但在這個新的方法中,我調用paintComponent方法來完成繪畫。這可能嗎? – user2449472

+2

你不應該直接調用paintComponent()。如果更改導致繪畫更改的類的屬性,則調用repaint(),然後Swing將確定何時重新繪製該組件。 – camickr

0

這個問題可能已被遺忘,但我偶然發現並希望幫助其他任何人。我找到的解決方案是使用JApplet的init()方法。在那裏你可以做所有你需要的計算。然後,如果你願意,你也可以創建一個定時器,以指定的時間間隔響應,調用repaint()並進行迭代工作。這樣,除了實際的繪圖代碼外,您可以保留所有內容。它看起來像這樣:

public void init() 
    { 
     //do calculations here 

    javax.swing.Timer timer = new javax.swing.Timer(1000/frameRate, new ActionListener() 
    { 
     public void actionPerformed(ActionEvent evt) 
     { 
      //this is called every so often. Can link to update loops or be an 
      //update loop itself. 
      repaint(); 
     } 
    }); 
    timer.start(); 
} 

public void paint(Graphics g) 
{  
    //All the actual drawing code for the shapes goes here. 
} 
相關問題