排序JTable的rowAtPoint(Point)的返回值

时间:2014-05-24 21:06:49

标签: java swing jtable jcheckbox abstracttablemodel

我正在尝试在JTable中点击一个Checkbox更改值。这是我在MouseListener中使用的代码

public void mouseClicked(MouseEvent e) {
    Point mouse = e.getPoint();
    int row = table.rowAtPoint(mouse);
    int col = table.columnAtPoint(mouse);
    if (col == 0) tableModel.setValueAt(new Boolean(!(Boolean) tableModel.getValueAt(row, col)), row, col);
}

问题是,当我对表进行排序时,会发生这种情况

Problem with sorting

这是SSCCE

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;

@SuppressWarnings("serial")
public class SSCCE extends JFrame {

    JTable table;

    public SSCCE() {
        setSize(300, 200);
        Object[][] data = { {false, "This is false"}, {true, "This is true"}};
        table = new JTable(new CustomTableModel(data));
        add(table);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private class CustomTableModel extends AbstractTableModel {
        Object[][] data;

        public CustomTableModel(Object[][] data) {
            this.data = data;
        }

        public Class<?> getColumnClass(int columnIndex) {
            return data[0][columnIndex].getClass();
        }

        public int getColumnCount() {
            return data[0].length;
        }

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

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

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

有解决方法吗?或者更好的方法(而不是ListListener)来检测单元格上的点击?

1 个答案:

答案 0 :(得分:3)

无需使用MouseListener。您只需要为该列使用适当的编辑器,表格将为您处理。

阅读How to Use Tables上Swing教程中的部分,了解更多信息和工作示例。

基本上你需要做两件事:

  1. Boolean数据添加到TableModel
  2. 覆盖getColumnClass(...)的{​​{1}}方法以返回该列的TableModel,表格将选择相应的编辑器。
  3. 以上是您的问题的答案,但是对于将来的信息,MouseEvent是相对于表的,因此您希望使用表方法来访问数据。那就是你会使用Boolean.classtable.getValueAt(...)。它们引用当前在表格视图中显示的数据。也就是说,可以对视图进行排序,也可以移动列。