Являются ли индексы строк и столбцов, которые TableCellEditor#getTableCellEditorComponent() получает координаты представления?

Я пишу реализацию TableCellEditor, которая должна получать некоторые данные из базовой модели TableModel. Для этого мне нужны индексы строк и столбцов для TableModel.

Я хотел бы знать, являются ли индексы, получаемые getTableCellEditorComponent(), координатами представления или координатами модели. Другими словами, нужны ли вызовы table.convertRowIndexToModel() и table.convertColumnIndexToModel() в следующем коде? Или можно просто передать эти показатели model.getValueAt() напрямую?

class MyTableCellEditor implements TableCellEditor {

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        TableModel model = table.getModel();

        // is this necessary?
        int rowForQueryingModel = table.convertRowIndexToModel(row);
        int colForQueryingModel = table.convertColumnIndexToModel(column);

        Object valueFromModel = model.getValueAt(rowForQueryingModel, colForQueryingModel);
        return createComponent(valueFromModel);
    }
   ...
}

person Kohei Nozaki    schedule 12.11.2020    source источник
comment
Что произошло, когда вы попробовали это? Или, говоря по-другому: почему вы спрашиваете нас, когда вы можете провести эксперимент, чтобы подтвердить это за 5-10 минут?   -  person Andrew Thompson    schedule 12.11.2020
comment
Почему вы хотите вызвать model.getValueAt(…), когда параметр value уже предоставляет значение?   -  person Holger    schedule 12.11.2020
comment
Мне нужно получить некоторый объект домена, используя индекс строки из модели. Это был плохой пример..   -  person Kohei Nozaki    schedule 12.11.2020


Ответы (1)


Модуль рендеринга ячеек получает координаты вида. Это полезно для выполнения таких действий, как окрашивание четных и нечетных строк или столбцов по-разному и т. д. Извлечение данных не считалось основной целью, поскольку фактическое значение уже указано в качестве параметра.

Если вам по какой-то причине нужно получить доступ к данным модели, вы должны преобразовать координаты.

Вы можете легко проверить это с помощью простой примерной программы:

public class CellRendererTest {
    public static void main(String... args) {
        if(!EventQueue.isDispatchThread()) {
            EventQueue.invokeLater(CellRendererTest::main);
            return;
        }
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch(ReflectiveOperationException | UnsupportedLookAndFeelException ex) {}

        JFrame frame = new JFrame("Test");
        Object[][] data = new Object[10][10];
        String[] name = new String[10];
        for (int ix = 0; ix < data.length; ix++) {
            data[ix][0] = ix + 1;
            data[ix][1] = new String(Character.toChars('A' + ix % 3));
            name[ix] = new String(Character.toChars('A' + ix));
        }
        JTable table = new JTable(data, name);
        table.setAutoCreateRowSorter(true);
        DefaultTableCellRenderer r = new DefaultTableCellRenderer();
        table.setDefaultRenderer(Object.class, (t, val, s, f, row, column) ->
                r.getTableCellRendererComponent(t, val != null? val: row+", "+column,
                                                s, f, row, column));
        frame.setContentPane(new JScrollPane(table));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

Вы можете изменить порядок столбцов, перетащив заголовок столбца, или изменить порядок строк, щелкнув заголовок столбца A или B, чтобы отсортировать данные, но другие ячейки, отображающие аргументы row и column, предоставленные средству визуализации, будут продолжать отражать их визуальное положение.

person Holger    schedule 12.11.2020