2011-12-01 70 views
0
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at A_test.addButton(A_test.java:27) 
    at A_test.<init>(A_test.java:17) 
    at Main$1.run(Main.java:11) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

主要類有人可以解釋爲什麼我在Java中得到這個錯誤嗎?

import javax.swing.*; 

public class Main { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() {     
      public void run() { 
       new A_test(); 
      } 
     }); 
    } 
} 

A_test類

import java.awt.event.*; 
import javax.swing.*; 

public class A_test implements ActionListener { 

    private JFrame jf; 

    public A_test() { 
     JFrame jf = new JFrame("A simple swing Program"); 
     jf.setSize(275,100); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel jl = new JLabel("Swing powers the modern JAVA GUI"); 
     jf.getContentPane().add(jl); 
     this.addButton(); 
     jf.setVisible(true); 
    } 

    public void addButton() { 
     JButton jb = new JButton("Submit"); 
     jf.getContentPane().add(jb); 
     jb.addActionListener(this); 
     jf.getContentPane().add(jb); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     ((JLabel) jf.getContentPane().getComponent(0)).setText("test"); 
    }  
} 

我使用A_test類,以創建一個標籤,並在它的按鈕的JFrame。當我按下按鈕時,我希望應用程序將標籤的文本從之前的版本更改爲「測試」。

+0

哪一條是第27行? – Tudor

+0

@Tudor jf.getContentPane()。add(jb); – DaveJohnston

回答

4

這裏

JFrame jf = new JFrame("A simple swing Program"); 
jf.setSize(275,100); 
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
JLabel jl = new JLabel("Swing powers the modern JAVA GUI"); 
jf.getContentPane().add(jl); 
this.addButton(); 
jf.setVisible(true); 

您正在創建一個新的JFrame,而不是私有實例變量分配給新的JFrame。 到時候你達到這一點:

JButton jb = new JButton("Submit"); 
jf.getContentPane().add(jb); 
jb.addActionListener(this); 
jf.getContentPane().add(jb); 

jf仍然是空;

只是這樣做:

jf = new JFrame("A simple swing Program"); 
jf.setSize(275,100); 
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
JLabel jl = new JLabel("Swing powers the modern JAVA GUI"); 
jf.getContentPane().add(jl); 
this.addButton(); 
+0

+1好的工作先生! – Tudor

1

你有JF的兩個實例。一個是班級的成員,沒有初始化。另一個是初始化的構造函數中的局部變量。所以當addButton被調用時,你試圖訪問null變量,因此是NullPointerException。

1

您應該開始使用Eclipse或NetBeans等編輯器並注意警告。他們會告訴你到底發生了什麼錯誤(你的變量是遮蔽了一個成員變量)。 Java提供了令人敬畏的警告 - Java的「挑剔」使得許多人認爲語言更「難」,但它實際上使得它更容易。從長遠來看,語法鬆散的語言實際上要困難得多。

相關問題