Swing菜單與工具欄(四) – JAVA編程語言程序開發技術文章

 6.1.8 JCheckBoxMenuItem類
Swing的JCheckBoxMenuItem組件的行為類似於我們將一個JCheckBox作為一個JMenuItem放置在菜單上。菜單項的數據模型是ToggleButtonModel,我們在第5章進行瞭描述。他可以使得菜單項具有選中或是未選中狀態,同時顯示合適的狀態圖標。因為數據模型是ToggleButtonModel,當JCheckBoxMenuItem位於一個ButtonGroup中時,該組中隻有一個JCheckBoxMenuItem可以被選中。然而,這並不是JCheckBoxMenuItem的通常使用方法,並且很可能會迷惑用戶。如果我們需要這種行為,我們可以使用JRadioButtonMenuItem,如本章稍後所述。


創建JCheckBoxMenuItem組件


JCheckBoxMenuItem有七個構造函數。這些構造函數可以允許我們初始化文本標簽,圖標以及初始狀態。


public JCheckBoxMenuItem()
JCheckBoxMenuItem jCheckBoxMenuItem = new JCheckBoxMenuItem();   public JCheckBoxMenuItem(String text)
JCheckBoxMenuItem jCheckBoxMenuItem = new JCheckBoxMenuItem(“Boy”);   public JCheckBoxMenuItem(Icon icon)
Icon boyIcon = new ImageIcon(“boy-r.jpg”);
JCheckBoxMenuItem jCheckBoxMenuItem = new JCheckBoxMenuItem(boyIcon);   public JCheckBoxMenuItem(String text, Icon icon)
JCheckBoxMenuItem jCheckBoxMenuItem = new JCheckBoxMenuItem(“Boy”, boyIcon);   public JCheckBoxMenuItem(String text, boolean state)
JCheckBoxMenuItem jCheckBoxMenuItem = new JCheckBoxMenuItem(“Girl”, true);   public JCheckBoxMenuItem(String text, Icon icon, boolean state)
Icon girlIcon = new ImageIcon(“girl-r.jpg”);
JCheckBoxMenuItem jCheckBoxMenuItem = new JCheckBoxMenuItem(“Girl”, girlIcon, true);   public JCheckBoxMenuItem(Action action)
Action action = …;
JCheckBoxMenuItem jCheckBoxMenuItem = new JCheckBoxMenuItem(action);


與JCheckBox不同,圖標是標簽的一部分,而並不是一個單獨的設備來表明某項是否被選中。如果在其構造函數中並沒有傳遞文本標簽或是圖標,菜單項標簽部分則會被設置其空的默認值。默認情況下,JCheckBoxMenuItem初始時未選中。


JCheckBoxMenuItem屬性


JCheckBoxMenuItem的大部分屬性都是由JCheckBoxMenuItem的多個超類繼承來的。表6-11列出瞭JCheckBoxMenuItem所列出的四個屬性。


JCheckBoxMenuItem屬性


屬性名
 數據類型
 訪問性
 
accessibleContext
 AccessibleContext
 隻讀
 
selectedObjects
 Object[]
 隻讀
 
state
 boolean
 讀寫
 
UIClassID
 String
 隻讀
 


處理JCheckBoxMenuItem選中事件


對於JCheckBoxMenuItem而言,我們可以關聯多個事件變體:


JMenuItem中的MenuDragMouseListener與MenuKeyListener
AbstractButton中的ActionListener,ChangeListener與ItemListener
JComponent中的AncestorListener與VetoableChangeListener
Container中的ContainerListener與PropertyChangeListener
Component中的ComponentListener,FocusListener,HierarchyBoundsListener,HierarchyListener,InputMenthodListener,KeyListener,MouseListener,MouseMotionListener以及MouseWheelListener
盡管我們可以監聽18種沒的事件類型,但是最有趣的還是ActionEvent與ItemEvent,如下所述。


使用ActionListener監聽JCheckBoxMenuItem事件


將ActionListener關聯到JCheckBoxMenuItem可以使得我們確定菜單何時被選中。監聽器會被通知選中事件,但是並不會得到新狀態的通知。要確定選中狀態,我們必須獲取事件源模型並查詢選中狀態,如下面的示例ActionListener源碼所示。這個監聽器會依據當前的選中狀態修改復選框的文本與圖標標簽。


ActionListener aListener = new ActionListener() {
   public void actionPerformed(ActionEvent event) {
     Icon girlIcon = new ImageIcon(“girl-r.jpg”);
     Icon boyIcon = new ImageIcon(“boy-r.jpg”);
     AbstractButton aButton = (AbstractButton)event.getSource();
     boolean selected = aButton.getModel().isSelected();
     String newLabel;
     Icon newIcon;
     if (selected) {
       newLabel = “Girl”;
       newIcon = girlIcon;
     } else {
       newLabel = “Boy”;
       newIcon = boyIcon;
     }
     aButton.setText(newLabel);
     aButton.setIcon(newIcon);
   }
};


使用ItemListener監聽JCheckBoxMenuItem事件


如果我們使用ItemListener監聽JCheckBoxMenuItem選中事件,我們並不需要查詢事件源以確定選中狀態,事件已經帶有這些信息瞭。依據這個狀態,我們可以進行正確的響應。使用ItemListener重新創建ActionListener的行為隻需要對前面所列出的源代碼進行簡單的修改,如下所示:


ItemListener iListener = new ItemListener() {
   public void itemStateChanged(ItemEvent event) {
     Icon girlIcon = new ImageIcon(“girl-r.jpg”);
     Icon boyIcon = new ImageIcon(“boy-r.jpg”);
     AbstractButton aButton = (AbstractButton)event.getSource();
     int state = event.getStateChange();
     String newLabel;
     Icon newIcon;
     if (state == ItemEvent.SELECTED) {
       newLabel = “Girl”;
       newIcon = girlIcon;
     } else {
       newLabel = “Boy”;
       newIcon = boyIcon;
     }
     aButton.setText(newLabel);
     aButton.setIcon(newIcon);
   }
};


自定義JCheckBoxMenuItem觀感


圖6-3顯示瞭預安裝的觀感類型集合下JCheckBoxMenuItem的外觀。


表6-12列出瞭JCheckBoxMenuItem的UIResource相關的屬性。JCheckBoxMenuItem組件具有19個不同的屬性。


JCheckBoxMenuItem UIResource元素


 
屬性字符串
 對象類型
 
CheckBoxMenuItem.acceleratorFont
 Font
 
CheckBoxMenuItem.acceleratorForeground
 Color
 
CheckBoxMenuItem.acceleratorSelectionForeground
 Color
 
CheckBoxMenuItem.actionMap
 ActionMap
 
CheckBoxMenuItem.arrowIcon
 Icon
 
CheckBoxMenuItem.background
 Color
 
CheckBoxMenuItem.border
 Border
 
CheckBoxMenuItem.borderPainted
 Boolean
 
CheckBoxMenuItem.checkIcon
 Icon
 
CheckBoxMenuItem.commandSound
 String
 
CheckBoxMenuItem.disabledForeground
 Color
 
CheckBoxMenuItem.font
 Font
 
CheckBoxMenuItem.foreground
 Color
 
CheckBoxMenuItem.gradient
 List
 
CheckBoxMenuItem.margin
 Insets
 
CheckBoxMenuItem.opaue
 Boolean
 
CheckBoxMenuItem.selectionBackground
 Color
 
CheckBoxMenuItem.selectionForeground
 Color
 
CheckBoxMenuItemUI
 String
 


 


與CheckboxMenuItem.checkIcon屬性鍵值相關聯的Icon是顯示在JCheckBoxMenuItem上的圖標。如果我們不喜歡默認圖標,我們可以使用下面的代碼行進行修改,在這裡假定已經定義並創建瞭新圖標:


UIManager.put(“CheckBoxMenuItem.checkIcon”, someIcon);為瞭使得新圖標可以顯示合適的選中圖像,Icon實現必須其paintIcon()方法內檢測關聯的菜單組件狀態。第4章所創建的DiamondIcon對於這個圖標並不起作用,因為他並不檢測其狀態組件。相反,狀態是在構造是確定的。列表6-4列出瞭一個可以使用的圖標類。


package net.ariel.ch06;   import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Polygon;   import javax.swing.AbstractButton;
import javax.swing.Icon;   public class DiamondAbstractButtonStateIcon implements Icon {   private final int width = 10;
 private final int height = 10;
 private Color color;
&nbsp

發佈留言