Toggle Buttons(二) – JAVA編程語言程序開發技術文章

5.3 JToggleButton類


JToggleButton是第一個可切換的組件。首先討論JToggleButton類是因為他是其他們非面向菜單的組件,JCheckBox與JRadioButton,的父類。JToggleButton類似於JButton,當被選中時處理按下狀態,相反則會返回到未選中狀態。要取消被選中的組件,我們必須重新選擇該組件。JToggleButton並不是一個被廣泛使用的組件,但是我們會發現在工具欄上這個組件會非常有用,例如在Microsoft Word中或是在一個文件對話奇巧事,如圖5-2所示。


Swing_5_2


定義JToggleButton結構是兩個自定義AbstractButton父類的對象:ToggleButonModel與ToggleButtonUI。ToggleButtonModel類表示組件的自定義的ButtonModel數據模型,而ToggleButtonUI則是用戶接口委托。


下面我們已經瞭解瞭JToggleButton的不同方面,現在我們來瞭解一下如何使用。


5.3.1 創建JToggleButton組件


對於JToggleButton有八個構造函數:

public JToggleButton()
JToggleButton aToggleButton = new JToggleButton();   
public JToggleButton(Icon icon)
JToggleButton aToggleButton = new JToggleButton(new DiamondIcon(Color.PINK))   
public JToggleButton(Icon icon, boolean selected)
JToggleButton aToggleButton = new JToggleButton(new DiamondIcon(Color.PINK), true);   
public JToggleButton(String text)
JToggleButton aToggleButton = new JToggleButton(“Sicilian”);   
public JToggleButton(String text, boolean selected)
JToggleButton aToggleButton = new JToggleButton(“Thin Crust”, true);   
public JToggleButton(String text, Icon icon)
JToggleButton aToggleButton = new JToggleButton(“Thick Crust”,
new DiamondIcon(Color.PINK));  
 public JToggleButton(String text, Icon icon, boolean selected)
JToggleButton aToggleButton = new JToggleButton(“Stuffed Crust”,
new DiamondIcon(Color.PINK), true);   public JToggleButton(Action action)
Action action = …;
JToggleButton aToggleButton = new JToggleButton(action);

每一個都允許我們自定義一個或是多個標簽,圖標,或是初始選中狀態。除非指定,標簽是空的,沒有文本或是圖標,而按鈕初始時未被選中。


5.3.2 JToggleButton屬性


在創建瞭JToggleButton之後,我們就可以修改其屬性。盡管JToggleButton有近100個繼承的屬性,表5-1隻顯示瞭JToggleButton所引入的兩個屬性。其餘的屬性來自於AbstractButton,JComponent,Container以及Component。


JToggleButton屬性















屬性名
數據類型

訪問性

accessibleContext
AccessibleContext

隻讀

UIClassID
String

隻讀


我們可以在構造函數中修改一個或是多個text, icon或是selected屬性,以及第4章所描述的其他的AbstractButton屬性。我們可以通過getter與setter方法配置基本的三個屬性:get/setText(), get/setIcon()以及is/setSelected()或setAction(action)。其他的屬性也具有相應的getter與setter方法。


JToggleButton的更多的可視化配置選項包括按鈕不同狀態的各種圖標。除瞭標準圖標以外,當按鈕被選中時,我們可以顯示一個不同的圖標。然而,如果我們正基於當前的選中狀態修改圖標,那麼JToggleButton也許並不是最合適的組件。我們可以修改其子類,JCheckBox或是JRadioButton,我們會在本章稍後進行討論。


5.3.3 處理JToggleButton選中事件


在配置瞭JToggleButton之後,我們可以使用三種方法來處理選中事件:使用ActionListener,ItemListener或是ChangeListener。除瞭向構造函數提供Action之外,被通知的方式類似於ActionListener。


使用ActionListener監聽JToggleButton事件


如果我們隻對當用戶選中或是取消選中JToggleButton時所發生事件感興趣,我們將ActionListener與組件相關聯。在用戶選中按鈕之後,組件會通知任何已註冊的ActionListener對象。不幸的是,這並不是所需要的行為,因為我們必須主動確定按鈕的狀態,從而我們能夠對選中或是取消選中進行正確的響應。要確定選中狀態,我們必須獲取事件源的模型,然後查詢其選中狀態,如下面的ActionListener示例源碼所示:

ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
AbstractButton abstractButton = (AbstractButton)actionEvent.getSource();
boolean selected = abstractButton.getModel().isSelected();
System.out.println(“Action – selected=” + selected + ” n”);
}
};

使用ItemListener監聽JToggleButton事件


關聯到JToggleButton更好的監聽器是ItemListener。ItemEvent會被傳遞到ItemListener的itemStateChanged()方法,包括按鈕當前的選中狀態。這使得我們可以進行正確的響應,而不需要查詢當前的按鈕狀態。


為瞭演示,下面的ItemListener報告被選中的ItemEvent生成組件的狀態:

ItemListener itemListener = new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
int state = itemEvent.getStateChange();
if (state == ItemEvent.SELECTED) {
System.out.println(“Selected”);
} else {
System.out.println(“Deselected”);
}
}
};

使用ChangeListener監聽JToggleButton事件


將ChangeListener關聯到JToggleButton提供更多的靈活性。任意關聯的監聽器都會得到按鈕數據模型變化的通知,響應armed, pressed以及selected屬性的變化。由三個監聽器監聽通知-ActionListener, ItemListener以及ChangeListener-使得我們有七次不同的反應。


圖5-3顯示瞭ButtonModel屬性變化序列,以及模型何時通知每個監聽器。


Swing_5_3


為瞭演示ChangeListener通知,下面的代碼片段定義瞭一個報告按鈕模型三個屬性狀態變化的ChangeListener:


ChangeListener changeListener = new ChangeListener() {
  public void stateChanged(ChangeEvent changeEvent) {
    AbstractButton abstractButton = (AbstractButton)changeEvent.getSource();
    ButtonModel buttonModel = abstractButton.getModel();
    boolean armed = buttonModel.isArmed();
    boolean pressed = buttonModel.isPressed();
    boolean selected = buttonModel.isSelected();
    System.out.println(“Changed: ” + armed + “/” + pressed + “/” + selected);
  }
};
在我們將ChangeListener關聯到JToggleButton之後並且通過組件之上的鼠標按下與釋放選中組件時,輸出結果如下:


Changed: true/false/false


Changed: true/true/false


Changed: true/true/true


Changed: true/false/true


Changed: false/false/true


將所有三個監聽器關聯到相同的按鈕,已註冊的ItemListener對象的通知將會在選中屬性變化之後發生,換句說,在第3行與第4行之間。列表5-2演示瞭叛逆到相同的JToggleButton的所有三個監聽器。考慮到已註冊的ActionListener對象,通知發生在釋放按鈕之後,但是卻在armed狀態變為false之前,在第4行與第5行之間。


package swingstudy.ch04;   import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;   import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
im

發佈留言