Отсортированное возвращаемое JTable значение rowAtPoint(Point)

Я пытаюсь изменить значение флажка при щелчке в JTable. Вот код, который я использую для этого в 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) для обнаружения щелчков по ячейкам?


person usama8800    schedule 24.05.2014    source источник
comment
Найдите решение на странице Как добавить флажки в JTABLE swing, которое работает нормально в вашем случае также. Вам вообще не нужно добавлять прослушиватель мыши.   -  person Braj    schedule 25.05.2014
comment
Я предполагаю, что ваша проблема в том, что вы не реализовали метод setValueAt(...) в своей пользовательской модели, поэтому редактор не может сохранить обновленное значение. Нет причин создавать пользовательскую TableModel. Вы можете просто использовать DefaultTableModel и переопределить метод getColumnClass(...).   -  person camickr    schedule 25.05.2014
comment
Не используйте [data[0][columnIndex].getClass()] для определения типа столбца! что произойдет, если значение равно нулю? При сортировке вам нужно перевести между представлением и индексами модели   -  person MadProgrammer    schedule 25.05.2014


Ответы (1)


Нет необходимости использовать MouseListener. Вам просто нужно использовать правильный редактор для столбца, и таблица сделает это за вас.

Прочтите раздел руководства по Swing Как использовать таблицы для больше информации и рабочих примеров.

В основном вам нужно сделать две вещи:

  1. Добавьте Boolean данные в TableModel
  2. Переопределите метод getColumnClass(...) для TableModel, чтобы вернуть Boolean.class для этого столбца, и таблица выберет соответствующий редактор.

Выше приведен ответ на ваш вопрос, но для будущей информации MouseEvent относится к таблице, поэтому вы хотите использовать методы таблицы для доступа к данным. То есть вы бы использовали table.getValueAt(...) и table.setValueAt(...). Они ссылаются на данные, как они в настоящее время отображаются в представлении таблицы. То есть представление могло быть отсортировано или столбец мог быть перемещен.

person camickr    schedule 24.05.2014
comment
Я мог использовать только последнюю часть. Когда я делаю две упомянутые вами вещи, он только устанавливает флажок и не обновляет его, когда я нажимаю на него. - person usama8800; 25.05.2014
comment
@MadProgrammer Проверьте мой обновленный ответ для SSCCE и, пожалуйста, покажите мне правильный способ сделать это. - person usama8800; 25.05.2014
comment
@usama8800 Вы можете взглянуть на этот пример, а я нет проверял съедобность, основная концепция должна помочь вам начать - person MadProgrammer; 25.05.2014