我正在尝试在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);
}
问题是,当我对表进行排序时,会发生这种情况
这是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)来检测单元格上的点击?
答案 0 :(得分:3)
无需使用MouseListener。您只需要为该列使用适当的编辑器,表格将为您处理。
阅读How to Use Tables上Swing教程中的部分,了解更多信息和工作示例。
基本上你需要做两件事:
Boolean
数据添加到TableModel
getColumnClass(...)
的{{1}}方法以返回该列的TableModel
,表格将选择相应的编辑器。以上是您的问题的答案,但是对于将来的信息,MouseEvent是相对于表的,因此您希望使用表方法来访问数据。那就是你会使用Boolean.class
和table.getValueAt(...)
。它们引用当前在表格视图中显示的数据。也就是说,可以对视图进行排序,也可以移动列。