首页 >Java >java教程 >如何在 JTable 中实现链接复选框以进行多行选择?

如何在 JTable 中实现链接复选框以进行多行选择?

DDD
DDD原创
2024-12-05 19:43:11308浏览

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

选择多行并选中所有复选框

在 JTable 中,其中一列包含不可编辑的文本,而其他功能复选框控制布尔值,这是一种常见要求是链接复选框。这意味着当选择多行并且取消选中任何复选框时,所有其他选定的复选框也将变为取消选中。同样,如果选中一个复选框,则所有选定的复选框都应遵循该复选框。

实现链接的复选框

实现 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn