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

#java #swing #jtable #tablemodel

#java #качать #jtable #tablemodel

Вопрос:

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

Что я хотел бы знать, так это то, являются ли индексы, получаемые getTableCellEditorComponent(), координатами вида или координатами модели. Другими словами, table.convertRowIndexToModel() table.convertColumnIndexToModel() необходимы ли вызовы and в следующем коде? Или это нормально — просто передавать эти показатели 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);
    }
   ...
}
  

Комментарии:

1. Что произошло, когда вы попробовали это? Или, другими словами: почему вы спрашиваете нас, когда вы могли бы провести эксперимент, чтобы подтвердить это за 5-10 минут?

2. Почему вы хотите вызвать model.getValueAt(…) , когда value параметр уже предоставляет значение?

3. На самом деле мне нужно извлечь некоторый объект домена, используя индекс строки из модели. Это был плохой пример..

Ответ №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 , предоставленные средству визуализации, будут продолжать отражать их визуальное положение.