上例中還用到了 JLabel,這不是按鈕,而是一個靜態文本組件,主要用於顯示提示文本。要獲得一個 JLabel 對象當前顯示的文本內容,可以使用它的 getText() 方法;反之,要改變一個 JLabel 對象顯示的文本內容,應該使用它的 setText(String text) 方法,如上例中的 label.setText("You selected Toggle Button");。
其實這兩個方法同樣可以用於 JButton 等類。比如上例中我們使用 new JButton("JButton") 構造了一個按鈕 jButton,如果使用 jButton.getText() 就可以得到字符串 "JButton"。而 jButton.setText("A Button"),則可以改變按鈕上顯示的文字爲 "A Button"。這兩句代碼沒有寫出來,你可以自己試試。
上例中大量使用了動作監聽器 (ActionListener)。ActionListener 只監聽一個事件,這個事件在其相關組件上產生了動作時被觸發,因此叫作動作事件 (ActionEvent)。ActionListener 只有一個方法需要實現,就是 actionPerformed(ActionEvent ae)。按鈕、切換按鈕和單選按鈕被單擊時都會觸發動作事件,引起動作監聽器調用 actionPerformed 方法。因此,如果你想在單擊按鈕之後做什麼事,當然應該重載 ActionListener 的 actionPerformed 方法了。各種按鈕都提供了 addActionListener 方法以添加動作監聽器。
複選框就要特殊一些。雖然它也有 addActionListener 方法,意味着可以使用動作監聽器,但是使用之後你會發現動作監聽器並沒有起到預想的作用。爲什麼?原來,單擊一個複選按鈕,觸發的不是動作事件,而是條目事件 (ItemEvent) 中的狀態變化 (itemStateChanged) 事件,由條目監聽器 (ItemListener) 監聽,相應需要重載的方法是 ItemListener 的 itemStateChanged 方法。
上例中我們將一個名爲 al 的 ActionListener 添加到了每一個單選按鈕中,如何判斷是哪個單選按鈕觸發了事件並被 al 監聽到了呢?我們可以從 ActionEvent 的 getSource() 方法得到觸發事件單選按鈕。由於 getSource() 返回的是一個 Object 引用,雖然這個引用指向的是一個單選按鈕的實例,但我們還是需要將這個引用的類型轉換爲 JRadioButton,如上例中的:JRadioButton radio = (JRadioButton) ae.getSource();,只有這樣我們才能調用 JRadioButton 有而 Object 沒有的方法。
同時,還需要說明的一點是,每個單選按鈕都可以添加一個單獨的 ActionListener 實例,而不一定要添加同一個。同樣的道理,若干毫不相干的、需要添加 ActionListener 的若干組件,也可以添加同一個 ActionListener 實例。關鍵在於編程者對 actionPerformed 方法的重載。比如下面這段代碼就爲一個 JButton 對象和一個 JRadioButton 對象添加了同一個動作監聽器實例:
/** * Test.java * @author Fancy */ import javax.swing.*; import java.awt.event.*; public class Test { JButton b; JRadioButton rb; public Test() { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().setLayout(new java.awt.FlowLayout()); b = new JButton("JButton"); rb = new JRadioButton("RadioButton"); ActionListener a = new ActionListener() { public void actionPerformed(ActionEvent ae) { if (ae.getSource() == b) { System.out.println("You clicked the JButton"); } else { System.out.println("You clicked the RadioButton"); } } }; b.addActionListener(a); rb.addActionListener(a); f.getContentPane().add(b); f.getContentPane().add(rb); f.pack(); f.show(); } public static void main(String[] args) { new Test(); } } |
運行程序後,分別單擊兩個按鈕,相應的,在控制檯能分別得到如下輸出:
You clicked the JButton
You clicked the RadioButton
這說明多個不用的組件添加同一個監聽器是可行的——不過前提是這些組件都能添加這個監聽器。