JavaのJTableセルにJRadioButton(ラジオボタン)を追加・挿入する方法
JTableはJComponentクラスのサブクラスであり、情報を複数の行(Row)と列(Column)で表示するテーブルを作成するために使用できるSwingコンポーネントです。JTable上で値が選択されるとTableModelEventが生成され、このイベントはTableModelListenerインターフェースを実装することによって処理されます。
JTableのセルにラジオボタン(JRadioButton)を追加・挿入したい場合は、TableCellRendererインターフェースとDefaultCellEditorクラスをそれぞれカスタマイズします。レンダラーがセルの「表示」を担当し、エディターがクリック時の「編集動作」を担当するという役割分担になっています。
実装例
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class JTableRadioButtonTest extends JFrame {
private DefaultTableModel dtm;
private ButtonGroup bg;
private JTable table;
private JScrollPane jsp;
public JTableRadioButtonTest() {
setTitle("JTableRadioButton Test");
dtm = new DefaultTableModel();
dtm.setDataVector(new Object[][] {{"Course 1", new JRadioButton("Java")},
{"Course 1", new JRadioButton("Python")},
{"Course 1", new JRadioButton("Scala")},
{"Course 2", new JRadioButton("Selenium")},
{"Course 2", new JRadioButton("JavaScript")}},
new Object[] {"Course", "Technology"});
table = new JTable(dtm) {
public void tableChanged(TableModelEvent tme) {
super.tableChanged(tme);
repaint();
}
};
bg = new ButtonGroup();
bg.add((JRadioButton)dtm.getValueAt(0,1));
bg.add((JRadioButton)dtm.getValueAt(1,1));
bg.add((JRadioButton)dtm.getValueAt(2,1));
bg.add((JRadioButton)dtm.getValueAt(3,1));
bg.add((JRadioButton)dtm.getValueAt(4,1));
table.getColumn("Technology").setCellRenderer(new RadioButtonRenderer());
table.getColumn("Technology").setCellEditor(new RadioButtonEditor(new JCheckBox()));
jsp = new JScrollPane(table);
add(jsp, BorderLayout.NORTH);
setSize(400, 275);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new JTableRadioButtonTest();
}
}
class RadioButtonRenderer implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (value == null) return null;
return (Component)value;
}
}
class RadioButtonEditor extends DefaultCellEditor implements ItemListener {
private JRadioButton button;
public RadioButtonEditor(JCheckBox checkBox) {
super(checkBox);
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
if (value == null) return null;
button = (JRadioButton)value;
button.addItemListener(this);
return (Component)value;
}
public Object getCellEditorValue() {
button.removeItemListener(this);
return button;
}
public void itemStateChanged(ItemEvent e) {
super.fireEditingStopped();
}
}
コードのポイント
- RadioButtonRenderer(TableCellRenderer):
getTableCellRendererComponentメソッドでセルの値をそのままコンポーネントとして返すことで、ラジオボタンをセル内に描画します。 - RadioButtonEditor(DefaultCellEditor):
ItemListenerを実装しており、セルがクリックされたときにラジオボタンを編集コンポーネントとして返します。選択状態が変化するとfireEditingStopped()を呼び出して編集を確定させます。 - ButtonGroup:すべてのラジオボタンをグループに登録することで、同時に1つだけ選択できる排他制御を実現しています。
- tableChanged():
TableModelEvent発生時にrepaint()を呼び出すことで、モデル変更後も画面が正しく再描画されるようにしています。
実行結果

-
JavaのJMenuからJTabbedPaneに新しいタブを追加する方法
JTabbedPaneとはJTabbedPaneは、JComponentクラスを継承したSwingコンポーネントの一つで、複数のパネルをタブ形式で簡単に切り替えられるようにするUI部品です。各タブには1つのコンポーネントが関連付けられており、そのタブが選択されると対応するコンポーネントが表示されます。JTabbedPaneは、タブが選択されたタイミングでChangeListenerインターフェースを通じてイベントを発生させることができます。JTabbedPaneの主なメソッドには、add()、addTab()、fireStateChanged()、createChangeListener()、
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー