2013-02-04 97 views
0

我想繪製一個紅綠燈。基本上是一個長方形的框架,附有4個按鈕。我遵循了我所得到的指示,但我必須錯過一些東西。當我運行該程序,我得到:Java圖形不顯示

Exception in thread "main" java.lang.NullPointerException 
    at TrafficLightPanel.<init>(TrafficLightPanel.java:14) 
    at TrafficLightApp.main(TrafficLightApp.java:11) 

任何幫助將是巨大的^^

主要方法

import javax.swing.*; 
public class TrafficLightApp { 
public static void main(String[] args) { 

    JFrame frame = new JFrame("Traffic Lights"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    TrafficLightPanel lightPanel = new TrafficLightPanel(); //line 11 
    frame.add(lightPanel);//JFrame containing instance of TrafficLightPanel class 

    } 

} 

支持類

import javax.swing.*; 
import java.awt.*; 
public class TrafficLightPanel extends JPanel{ 
    private JButton red,amber,green,change; 
    private JLabel buttonLabel,lastPressed; 
    private JPanel buttonPanel; 

    public TrafficLightPanel(){ 
     //JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 

     panel.setSize(200,400); 
     panel.setBackground(Color.blue); 
     buttonPanel.setSize(80,390); //line 14 
     buttonPanel.setBackground(Color.white); 
     buttonPanel.add(red); 
     buttonPanel.add(amber); 
     buttonPanel.add(green); 
     buttonPanel.add(change); 
     buttonPanel.add(buttonLabel); 

     panel.add(buttonPanel); 
    } 
} 
+0

'buttonPanel.setSize(80,390);'這可能會被佈局管理器忽略。一般提示:除非更改功能,否則不要擴展「JPanel」。問題描述表明你打算爲一個面板進行自定義繪畫,但它可能沒有任何自己的「孩子」控制。該自定義繪畫面板可以通過重寫'getPreferredSize()'來提示***大小,然後將其添加到其他控件並將其添加到「父」面板(同樣只是一個實例,而不是擴展),並將父容器添加到GUI。 'frame.setVisible(true);'應該在frame.pack()之後立即。 –

回答

4

您使用一個很多空變量,只是因爲引用變量聲明一個t頂部,不是意思是他們奇蹟般地有一個實例分配給他們,你仍然需要製作JComponent對象。

既然你實例化了panel但是也沒有實例化buttonPanel,這是你的第一個NPE。你也沒有實例化你的JButtons,你只需將它們添加到你的buttonPanelbuttonLabellastPressed(但這個變量未被使用)。

另外,請記住,TrafficLightPanel已經是JPanel,您可能可以擺脫一些冗餘。

所以,基本上你要實例化(使用new關鍵字)每在頂部聲明在使用它之前每變量。定位也是一個問題,但這不是你目前的問題。

+3

+1特別是對於該行*「您可能能夠擺脫一些冗餘」*。 –