2013-05-03 64 views
1

我得到了2個類:
- 1st。使一個幀(JFrame的)並在其上
增加了一個面板(JPanel的) - 第二個使面板,並繪製在其上的矩形(至少我認爲它會)Java - 圖形用戶界面(swing) - 空指針異常

這是第一類

class Frame { 
JFrame frame; 
Panel panel; 

void draw() { 
    frame = new JFrame ("qwertz"); 
    frame.setVisible(true); 
    frame.setLocationRelativeTo(null); 
    frame.setSize(300,200); 

    panel = new Panel(); 
    panel.setLayout(null); 
    panel.paint(); 
    frame.add(panel); 
    }} 

和第二

class Panel extends JPanel { 
void paint() { 
    Graphics g = getGraphics(); 

    g.drawRect(50,50,90,70); 
}} 

當我調用從所述第一類中的draw()方法它引發此異常我:

java.lang.NullPointerException 
      at Panel.paint(Panel.java:8) (( g.drawRect(50,50,90,70); )) 
      at Frame.draw(Frame.java:15) (( panel.paint();   )) 
+2

面板爲awt.Panel保留Java名稱,將其更改爲MyPanel – mKorbel 2013-05-03 18:42:57

+0

檢出http://docs.oracle.com/javase/tutorial/uiswing/painting/ – 2013-05-04 03:23:19

回答

2

這不是你應該怎麼畫。畫一個組件,覆蓋JPanelpaintComponent(Graphics g)方法,然後調用repaint();

class MyPanel extends JPanel { 
    @Override // <-- this makes a compiler error if you typod the method name 
    public void paintComponent(Graphics g) { 
     g.drawRect(50,50,90,70); 
    } 
} 

panel = new MyPanel(); 
panel.setLayout(null); 
panel.repaint(); // <<---- Look here! It says repaint() not paint() 
frame.add(panel); 

另外,如果你需要做的就是油漆此面板上,我會考慮使用普通舊Component,並且重寫paint(Graphics g)而不是paintComponent(Graphics g)paintComponent(Graphics g)專門用於擺動部件。

+0

究竟發生了什麼,當您重寫** paintComponent (Graphics g)**方法,並且不要將** super.paintComponent(Graphics g)**添加到方法實現的第一行? – user2347921 2013-05-05 18:23:15

+0

如果您沒有覆蓋該方法,例如將childred添加到容器中,它將不會執行其他任何通常會執行的繪畫。 – 2013-05-06 01:52:57

0

您正在嘗試在將面板添加到幀之前繪製面板。嘗試將frame.paint();移動到frame.add(panel);以下。另外如果你使用Swing,你應該使用JPanel而不是Panel。