簡體   English   中英

繪圖時Java Swing NullPointerException

[英]Java Swing NullPointerException when drawing

我正在使用自定義的JLayeredPane。 我有幾個形狀需要在JLayeredPane的不同圖層上繪制。

為了測試這一點,我創建了一個JPanel並詢問其圖形。 然后,在該JPanel上繪制一個測試矩形(准備圖形),並從JLayeredPane的paintComponent方法中最終繪制所有內容。 但這會失敗(NullPointerException)。

public class MyCustomPanel extends JLayeredPane {

// test
JPanel testpane;
Graphics g2;
// test

// constructor
public MyCustomPanel() {
    testpane = new JPanel();
    this.add(testpane, new Integer(14));
    g2 = testpane.getGraphics();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g2.drawRect(10, 10, 300, 300);
}

}

// run:
//Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
//        at view.MyCustomPanel.paintComponent(MyCustomPanel.java:65)

為什么我不能在JLayeredPane中使用這樣的JPanel? 我可以從我的paintComponent方法中直接在我的JLayeredPane上繪制,但這是在JLayeredPane的默認面板上。 我需要創建並繪制在JLayeredPane中添加的幾層上。

我究竟做錯了什么? :s

您應該使用g2轉換傳遞給您的Graphics

Graphics2D g2 = (Graphics2D)g;

您為什么不嘗試將事情解耦呢?

class InnerPanel extends JPanel
{
  public void paint(Graphics g)
  {
     Graphics2D g2 = (Graphics2D)g;
     g2.drawRect(....);
  }
}

class MyLayered extends JLayeredPane()
{
  MyLayered()
  {
    this.add(new InnerPanel(), 14);
  }
}

這更有意義。

也因為您正在嘗試做與Swing行為不同的事情。 Swing會自己照顧要在必須顯示的內容上調用適當的paint方法,並且要使用此協議,您應該在Swing向您的對象(調用paint )方法提出要求時告訴Graphics對象要繪制的內容,而不是在您需要時去做吧。

這樣,只要Swing想要繪制JLayeredPane您就可以在其他對象的Graphic對象上繪制事物,而無需考慮在適當的時候Swing會調用其適當的方法。

總結: 不能在Graphic對象上繪制任何東西。 您可以在Swing調用的方法中執行此操作,因為否則這些對象的Graphics不會有任何意義。

變量g2可能為null,因為您在構造函數中而不是在繪制時進行了設置。 而是使用傳入的“ g”。

您只能從當前正在繪制的組件中獲取合法的圖形。 否則無效。 在您要求它的時候,沒有顯示MyCustomPanel(),也沒有顯示Testpane。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM