// Adapted from Bruce Eckel's "Thinking in Java", 3d Ed, Chapter 14 // Uses reflection to create groups // of different types of AbstractButton. import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.border.*; import java.lang.reflect.*; public class ButtonGroups2 extends JFrame { private static String[] ids = { "Tripp", "Trapp", "Trull", }; private JPanel makeButtonPanel(Class klass, String[] ids) { ButtonGroup group = new ButtonGroup(); JPanel panel = new JPanel(); String title = klass.getName(); panel.setBorder(new TitledBorder(title)); for (int i = 0; i < ids.length; i++) { AbstractButton button = new JButton("failed"); try { // Get the dynamic constructor method // that takes a String argument: Constructor ctor = klass.getConstructor(new Class[] {String.class}); // Create a new object: button = (AbstractButton) ctor.newInstance(new Object[] {ids[i]}); } catch (Exception e) { System.out.println("Exception caught: " + e); } group.add(button); panel.add(button); } return panel; } public ButtonGroups2() { super("ButtonGroups2"); Container cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.add(makeButtonPanel(JButton.class, ids)); cp.add(makeButtonPanel(JToggleButton.class, ids)); cp.add(makeButtonPanel(JCheckBox.class, ids)); cp.add(makeButtonPanel(JRadioButton.class, ids)); } public static void main(String[] args) { ButtonGroups2 frame = new ButtonGroups2(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setVisible(true); } } // class ButtonGroups2