Я пытаюсь изменить значение изменения флажка при щелчке в JTable. Вот код, я использую для этого в MouseListenerСортированное возвращаемое значение JTable строкиAtPoint (Point)
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) для обнаружения кликов по ячейкам?
Найти решение в [Как добавить флажки в JTABLE swing] (http://stackoverflow.com/questions/7391877/how-to-add-checkboxes-to-jtable-swing), который отлично работает в вашем случае как Что ж. Вам не нужно добавлять слушателя мыши вообще. – Braj
Я бы предположил, что ваша проблема в том, что вы не реализовали метод setValueAt (...) 'в своей пользовательской модели, чтобы редактор не смог сохранить обновленное значение. Нет никаких оснований создавать пользовательскую TableModel. Вы можете просто использовать 'DefaultTableModel' и переопределить метод getColumnClass (...)'. – camickr
Не используйте [data [0] [columnIndex] .getClass()], чтобы определить тип столбца! что произойдет, если значение равно null? При сортировке вам нужно перевести между представлением и индексами модели. – MadProgrammer