ホームページ >Java >&#&チュートリアル >複数の行を選択するために JTable にリンクされたチェックボックスを実装するにはどうすればよいですか?

複数の行を選択するために JTable にリンクされたチェックボックスを実装するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-05 19:43:11308ブラウズ

How to Implement Linked Checkboxes in a JTable for Multiple Row Selection?

複数の行を選択し、すべてのチェックボックスをオンにする

JTable では、1 つの列が編集不可のテキストで構成され、他の機能のチェックボックスがブール値を制御します。これは一般的な要件です。チェックボックスをリンクすることです。つまり、複数の行が選択され、いずれかのチェックボックスがオフになっていると、選択されている他のすべてのチェックボックスもオフになります。同様に、チェックボックスがチェックされている場合は、選択されているすべてのチェックボックスがそれに従う必要があります。

リンクされたチェックボックスの実装

DataModel クラスの実装:

  • DefaultTableModel クラスを拡張してカスタム DataModel を作成します。オーバーライドされたメソッド:

    • getColumnClass(int columnIndex): チェックボックス列のクラス タイプを返します (Boolean.class)。
    • isCellEditable(int row, int column): セルの編集を許可します。チェックボックスのみ

ボタンのあるコントロール パネルの作成:

  • すべてをクリアまたはチェックするボタンのあるコントロール パネルを追加します。選択したチェックボックス。

SelectionAction クラス:

  • ボタン イベントを処理するアクション クラスを実装します。
  • コンストラクターは、目的のアクション (クリアまたはチェック) を表すブール値を受け取ります。
  • actionPerformed メソッドは選択された行を反復処理し、チェックボックスの値を更新します

サンプル コード:**

次のコード スニペットは実装を示しています:

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.DefaultListSelectionModel;
import javax.swing.table.DefaultTableModel;

public class MultipleRowSelection extends JPanel {

    private static final int CHECK_COL = 1;
    private static final Object[][] DATA = {
        {"One", Boolean.TRUE}, {"Two", Boolean.FALSE},
        {"Three", Boolean.TRUE}, {"Four", Boolean.FALSE},
        {"Five", Boolean.TRUE}, {"Six", Boolean.FALSE},
        {"Seven", Boolean.TRUE}, {"Eight", Boolean.FALSE},
        {"Nine", Boolean.TRUE}, {"Ten", Boolean.FALSE}};
    private static final String[] COLUMNS = {"Number", "CheckBox"};
    private DataModel dataModel = new DataModel(DATA, COLUMNS);
    private JTable table = new JTable(dataModel);
    private DefaultListSelectionModel selectionModel;

    public MultipleRowSelection() {
        super(new BorderLayout());
        this.add(new JScrollPane(table));
        this.add(new ControlPanel(), BorderLayout.SOUTH);
        table.setPreferredScrollableViewportSize(new Dimension(250, 175));
        selectionModel = (DefaultListSelectionModel) table.getSelectionModel();
    }

    private class DataModel extends DefaultTableModel {

        public DataModel(Object[][] data, Object[] columnNames) {
            super(data, columnNames);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndex == CHECK_COL) {
                return getValueAt(0, CHECK_COL).getClass();
            }
            return super.getColumnClass(columnIndex);
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return column == CHECK_COL;
        }
    }

    private class ControlPanel extends JPanel {

        public ControlPanel() {
            this.add(new JLabel("Selection:"));
            this.add(new JButton(new SelectionAction("Clear", false)));
            this.add(new JButton(new SelectionAction("Check", true)));
        }
    }

    private class SelectionAction extends AbstractAction {

        boolean value;

        public SelectionAction(String name, boolean value) {
            super(name);
            this.value = value;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < dataModel.getRowCount(); i++) {
                if (selectionModel.isSelectedIndex(i)) {
                    dataModel.setValueAt(value, i, CHECK_COL);
                }
            }
        }
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("MultipleRowSelection");
        frame.add(new MultipleRowSelection());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}

結論

これらのクラスを実装することによってとアクション リスナーを使用すると、JTable 内の複数の行を選択し、対応するチェックボックスをまとめて切り替えることができるようになり、ユーザー エクスペリエンスとデータ操作を合理化します。

以上が複数の行を選択するために JTable にリンクされたチェックボックスを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。