2014-09-05 61 views
0

可以說我做了一個簡單的圖形應用程序。它有兩個類,主類和稱爲「面板」的第二類,它擴展了JPanel。 主類只是一個包含JPanel的JFrame。這裏是它的內容:在paintComponent()方法中,變量沒有改變

public static Panel panel = new Panel(); 

public static void main(String[] args) { 
    JPanel p = new Panel(); 
    JFrame fr = new JFrame(); 
    fr.setSize(600, 600); 
    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    fr.setLocationRelativeTo(null); 
    fr.setVisible(true); 
    fr.add(p); 
    while (true) { 
     fr.repaint(); 
     if (panel.test) panel.g2d.drawRect(30, 30, 40, 40); 
    } 
} 

第二類使用Graphics2D來創建JPanel的內容。它也具有在paintComponent()方法中更改的變量。下面是它的內容:

Graphics2D g2d; 
boolean test = false; 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g2d = (Graphics2D) g; 
    test = true; 
    g2d.setColor(Color.RED); 
    g2d.drawRect(10, 10, 20, 20); 
} 

然而,這裏的問題:既不test也不g2g出現的paintComponent()方法已被執行之後改變。儘管paintComponent()方法很好地繪製矩形,但main方法的while循環中的代碼永遠不會結束繪製矩形。在主要方法中,testg2g似乎總是分別爲falsenull。我在這裏錯過了什麼?無論如何,在paintComponent()方法之外使用graphics2D?

回答

1

擺脫那while (true)塊,這是不需要的,它是有害的,因爲它可能會跺腳你的GUI線程。相反,在您的JFrame上添加您的JPanel 之前請致電setVisible(true)

此外,創建一個Graphics2D字段並試圖在paintComponent之外使用它來引發NullPointerException。理解你沒有完全控制Swing圖形,不應該嘗試提取一個Graphics對象或者進行繪製。您將需要閱讀Swing圖形教程,以瞭解如何正確繪製Swing組件。

所以回答,

反正是有使用的paintComponent外的Graphics2D( ) 方法?

不可以。您可以通過使用BufferedImage的Graphics對象進行繪製來解決此問題,但是仍然需要將BufferedImage繪製到您的JPanel或JComponent的paintComponent方法。

+0

難道說變化,但問題仍然存在 – Dan 2014-09-05 23:02:49

+0

@SuperNew:如果您更改您的密碼,然後發佈新的代碼編輯到你原來的問題。不要擺脫原來的代碼,而是在它下面添加新的代碼。也顯示更多的代碼。也不要將任何類「Panel」命名爲與核心Java類名衝突。另外,你有沒有讀過教程? – 2014-09-05 23:04:46

0

嘗試使用相同的代碼ovveride這種方法太:

  @Override 
      public void paintComponents(Graphics grphcs) 
      { 
       super.paintComponents(grphcs); 
       //add code here 
      } 

,也是我recomand不使用的JPanel指針AWT面板變量。 因此改變:

 `JPanel p = new Panel(); to `JPanel p = new JPanel();`