Java圖形用戶界面設計4

既然我們已經將多個單選按鈕添加到一個 ButtonGroup 中了,那麼我們是不是可以將一個包含多個單選按鈕的 ButtonGroup 對象添加到 JFrame 的 Content Pane 中,以達到添加其中所有單選按鈕的目的呢?不行!ButtonGroup 不是一個可顯示的組件,它僅用於管理。所以,在往 JFrame 中添加一組 JRadioButton 的時候,需要一個一個的添加 JRadioButton,而不是籠統的添加一個 ButtonGroup。

  上例中還用到了 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

  這說明多個不用的組件添加同一個監聽器是可行的——不過前提是這些組件都能添加這個監聽器。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章