如果我們想單選鈕保持“異或”狀態,我們必須增加它們到一個按鈕組中,這幾乎同老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都會向我們展示“異或”行為。