Java如何禁用或启用JTable单元格选择?

禁用或启用JTable的单元格选择可以通过调用setCellSelectionEnabled(boolean cellSelectionEnabled)方法来完成。此方法接受一个boolean值。调用此方法还将分别更改表的行和列选择的状态。

要完全删除JTable组件的选择功能,我们可以false通过调用setFocusable(boolean focusable)方法将其可聚焦状态更改为。

package org.nhooo.example.swing;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;

public class JTableDisableSelection extends JPanel {
    public JTableDisableSelection() {
        initializePanel();
    }

    private void initializePanel() {
        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(500, 200));

        JTable table = new JTable(new PremiereLeagueTableModel());
        table.getColumnModel().getColumn(0).setMinWidth(150);

        // 禁用表格的单元格选择。
        table.setCellSelectionEnabled(false);

        // 将设置表焦点设置为false完全删除选择
        // 表组件的功能。
        table.setFocusable(false);

        JScrollPane pane = new JScrollPane(table);
        add(pane, BorderLayout.CENTER);
    }

    public static void showFrame() {
        JPanel panel = new JTableDisableSelection();
        panel.setOpaque(true);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("JTable Disable Selection");
        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JTableDisableSelection.showFrame();
            }
        });
    }

    class PremiereLeagueTableModel extends AbstractTableModel {
        // TableModel的列名
        private String[] columnNames = {
            "TEAM", "P", "W", "D", "L", "GS", "GA", "GD", "PTS"
        };

        // TableModel的数据
        private Object[][] data = {
            {"Liverpool", 3, 3, 0, 0, 7, 0, 7, 9},
            {"Tottenham", 3, 3, 0, 0, 8, 2, 6, 9},
            {"Chelsea", 3, 3, 0, 0, 8, 3, 5, 9},
            {"Watford", 3, 3, 0, 0, 7, 2, 5, 9},
            {"Manchester City", 3, 2, 1, 0, 9, 2, 7, 7}
        };

        public int getRowCount() {
            return data.length;
        }

        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public String getColumnName(int column) {
            return columnNames[column];
        }

        public Object getValueAt(int rowIndex, int columnIndex) {
            return data[rowIndex][columnIndex];
        }
    }
}