[英]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.