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