import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.JRadioButton;
import javax.swing.JButton;
public class MixedButtons extends javax.swing.JFrame {
public MixedButtons() {
super("JRadioButtonTable Example");
DefaultTableModel dm = new DefaultTableModel(new Object[][]{
{new String("one")},
{new String("two")},
{new String("three")},
{new String("four")},
{new String("five")}},
new Object[]{"Question", "Answer","Clown"});
JTable table = new JTable(dm);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
String[] answer = {"A", "B", "C"};
String[] Clown = {"Yes"};
table.getColumn("Answer").setCellRenderer(new RadioButtonRenderer(answer));
table.getColumn("Answer").setCellEditor(new RadioButtonEditor(new RadioButtonPanel(answer)));
table.getColumn("Clown").setCellRenderer(new CheckBoxRenderer(Clown));
table.getColumn("Clown").setCellEditor(new CheckBoxEditor(new CheckBoxPanel(Clown)));
setContentPane(new JScrollPane(table));
}
// Cell base
class RadioButtonPanel extends JPanel {
private JRadioButton[] buttons;
private JRadioButton noSelectionButton;
RadioButtonPanel(String[] str) {
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
buttons = new JRadioButton[str.length];
ButtonGroup group = new ButtonGroup();
noSelectionButton = new JRadioButton();
group.add(noSelectionButton);
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JRadioButton(str[i]);
buttons[i].setFocusPainted(false);
add(buttons[i]);
add(noSelectionButton);
group.add(buttons[i]);
}
}
public void addActionListener(ActionListener anActionListener) {
for (int i = 0; i < buttons.length; i++) {
buttons[i].addActionListener(anActionListener);
}
}
public void removeActionListener(ActionListener anActionListener) {
for (int i = 0; i < buttons.length; i++) {
buttons[i].removeActionListener(anActionListener);
}
}
public void setSelectedIndex(int index) {
if (index < 0 || index >= buttons.length) {
noSelectionButton.setSelected(true);
return;
}
for (int i = 0; i < buttons.length; i++) {
if (i == index) {
buttons[i].setSelected(true);
return;
}
}
}
public int getSelectedIndex() {
for (int i = 0; i < buttons.length; i++) {
if (buttons[i].isSelected()) {
return i;
}
}
return -1;
}
public JRadioButton[] getButtons() {
return buttons;
}
}
class CheckBoxPanel extends JPanel {
private JCheckBox[] buttons;
private JRadioButton noSelectionButton;
CheckBoxPanel(String[] str) {
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
buttons = new JCheckBox[str.length];
ButtonGroup group = new ButtonGroup();
//noSelectionButton = new JRadioButton();
group.add(noSelectionButton);
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JCheckBox(str[i]);
buttons[i].setFocusPainted(false);
add(buttons[i]);
//add(noSelectionButton);
group.add(buttons[i]);
}
}
public void addActionListener(ActionListener anActionListener) {
for (int i = 0; i < buttons.length; i++) {
buttons[i].addActionListener(anActionListener);
}
}
public void removeActionListener(ActionListener anActionListener) {
for (int i = 0; i < buttons.length; i++) {
buttons[i].removeActionListener(anActionListener);
}
}
public void setSelectedIndex(int index) {
if (index < 0 || index >= buttons.length) {
noSelectionButton.setSelected(true);
return;
}
for (int i = 0; i < buttons.length; i++) {
if (i == index) {
buttons[i].setSelected(true);
return;
}
}
}
public int getSelectedIndex() {
for (int i = 0; i < buttons.length; i++) {
if (buttons[i].isSelected()) {
return i;
}
}
return -1;
}
public JCheckBox[] getButtons() {
return buttons;
}
}
class RadioButtonRenderer extends RadioButtonPanel implements TableCellRenderer {
RadioButtonRenderer(String[] strs) {
super(strs);
}
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (value instanceof Integer) {
setSelectedIndex(((Integer)value).intValue());
}
return this;
}
}
class CheckBoxRenderer extends CheckBoxPanel implements TableCellRenderer {
CheckBoxRenderer(String[] strs) {
super(strs);
}
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (value instanceof Integer) {
setSelectedIndex(((Integer)value).intValue());
}
return this;
}
}
class RadioButtonEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
private RadioButtonPanel theRadioButtonPanel;
public RadioButtonEditor(RadioButtonPanel aRadioButtonPanel) {
theRadioButtonPanel = aRadioButtonPanel;
theRadioButtonPanel.addActionListener(this);
}
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
if (value instanceof Integer) {
theRadioButtonPanel.setSelectedIndex(((Integer) value).intValue());
}
return theRadioButtonPanel;
}
public Object getCellEditorValue() {
return new Integer(theRadioButtonPanel.getSelectedIndex());
}
public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
}
class CheckBoxEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
private CheckBoxPanel theRadioButtonPanel;
public CheckBoxEditor(CheckBoxPanel aRadioButtonPanel) {
theRadioButtonPanel = aRadioButtonPanel;
theRadioButtonPanel.addActionListener(this);
}
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
if (value instanceof Integer) {
theRadioButtonPanel.setSelectedIndex(((Integer) value).intValue());
}
return theRadioButtonPanel;
}
public Object getCellEditorValue() {
return new Integer(theRadioButtonPanel.getSelectedIndex());
}
public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
}
public static void main(String[] args) {
MixedButtons frame = new MixedButtons();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setSize(320, 140);
frame.setVisible(true);
}
}