Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのJTableセルにJRadioButton(ラジオボタン)を追加・挿入する方法

JTableJComponentクラスのサブクラスであり、情報を複数の行(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のJTableセルにJRadioButton(ラジオボタン)を追加・挿入する方法

  1. JavaのJMenuからJTabbedPaneに新しいタブを追加する方法

    JTabbedPaneとはJTabbedPaneは、JComponentクラスを継承したSwingコンポーネントの一つで、複数のパネルをタブ形式で簡単に切り替えられるようにするUI部品です。各タブには1つのコンポーネントが関連付けられており、そのタブが選択されると対応するコンポーネントが表示されます。JTabbedPaneは、タブが選択されたタイミングでChangeListenerインターフェースを通じてイベントを発生させることができます。JTabbedPaneの主なメソッドには、add()、addTab()、fireStateChanged()、createChangeListener()、

  2. JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説

    JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー