import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Gui01 implements ActionListener{ JButton btn; public static void main(String[] args) { Gui01 gui = new Gui01(); gui.go(); } public void go(){ //創建JFrame JFrame frame = new JFrame("my first Gui"); //創建按鈕 JButton btn = new JButton("click me"); //在window結束時,把程序結束 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //為按鈕添加事件監聽 btn.addActionListener(this); //把button添加到frame 的 pane上 frame.getContentPane().add(btn); //設置frame的大小 frame.setSize(500,500); //顯示frame frame.setVisible(true); } //此方法為事件響應的回調函數 public void actionPerformed(ActionEvent e){ System.out.println("hello world"); try{ btn.setText("i've been clicked."); }catch(Exception ex){ ex.printStackTrace(); } }}
2 回答
已采納

朕日理萬機
TA貢獻27條經驗 獲得超28個贊
你在類里面聲明了一個成員變量:
JButton btn;
然后在go方法里面聲明了一個局部變量
JButton btn = new JButton("click me");
局部變量就把成員變量屏蔽了,你實際上添加到JFrame里面的是這個局部的btn,而不是類成員btn。
局部btn出了go方法就不再被認得了,而actionPerformed方法里面的btn會認為是類成員btn,該成員并沒有被初始化,所以拋出空指針異常。
兩種解決方法:第一是去掉go方法里的聲明語句,改為初始化語句(看起來這是你的本意):
btn = new JButton("click me");
二是actionPerformed中不要調用成員變量btn,而是改為通過e來判斷到底哪個按鈕被按了:
((AbstractButton) e.getSource()).setText("i've been clicked.");
還有個小建議,以后盡量貼出錯誤信息,這樣回答的人更容易看明白;-)
添加回答
舉報
0/150
提交
取消