如果我們想單選鈕保持“異或”狀態,我們必須增加它們到一個按鈕組中,這幾乎同老AWT中的方法相同但更加的靈活。在下面將要證明的程序例子是,一些AbstruactButton能被增加到一個ButtonGroup中。
為避免重復一些代碼,這個程序利用映射來生不同類型的按鈕組。這會在makeBPanel中看到,makeBPanel創建了一個按鈕組和一個JPanel,並且為數組中的每個String就是makeBPanel的第二個自變量增加一個類對象,由它的第一個自變量進行聲明:
//: ButtonGroups.java // Uses reflection to create groups of different // types of AbstractButton. package c13.swing; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import java.lang.reflect.*; public class ButtonGroups extends JPanel { static String[] ids = { "June", "Ward", "Beaver", "Wally", "Eddie", "Lumpy", }; static JPanel makeBPanel(Class bClass, String[] ids) { ButtonGroup bg = new ButtonGroup(); JPanel jp = new JPanel(); String title = bClass.getName(); title = title.substring( title.lastIndexOf('.') + 1); jp.setBorder(new TitledBorder(title)); for(int i = 0; i < ids.length; i++) { AbstractButton ab = new JButton("failed"); try { // Get the dynamic constructor method // that takes a String argument: Constructor ctor = bClass.getConstructor( new Class[] { String.class }); // Create a new object: ab = (AbstractButton)ctor.newInstance( new Object[]{ids[i]}); } catch(Exception ex) { System.out.println("can't create " + bClass); } bg.add(ab); jp.add(ab); } return jp; } public ButtonGroups() { add(makeBPanel(JButton.class, ids)); add(makeBPanel(JToggleButton.class, ids)); add(makeBPanel(JCheckBox.class, ids)); add(makeBPanel(JRadioButton.class, ids)); } public static void main(String args[]) { Show.inFrame(new ButtonGroups(), 500, 300); } } ///:~
邊框標題由類名剔除了所有的路徑信息而來。AbstractButton初始化為一個JButton,JButtonr的標簽發生“失效”,因此如果我們忽略這個異常信息,我們會在屏幕上一直看到這個問題。getConstructor()方法產生了一個通過getConstructor()方法安放自變量數組類型到類數組的構建器對象,然後所有我們要做的就是調用newInstance(),通過它一個數組對象包含我們當前的自變量——在這種例子中,就是ids數組中的字符串。
這樣增加了一些更復雜的內容到這個簡單的程序中。為了使“異或”行為擁有按鈕,我們創建一個按鈕組並增加每個按鈕到我們所需的組中。當我們運行這個程序時,我們會注意到所有的按鈕除了JButton都會向我們展示“異或”行為。