TableCellEditor#getTableCellEditorComponent() 接收视图坐标的行和列索引是什么?
Are row and column indices that TableCellEditor#getTableCellEditorComponent() receives view coordinates?
我正在编写一个 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);
}
...
}
单元格渲染器接收视图坐标。这对于为偶数行和奇数行或列不同地着色等非常有用。获取数据并未被视为主要目标,因为实际值已作为参数提供。
如果出于某种原因需要访问模型数据,则必须转换坐标。
您可以使用一个简单的示例程序轻松检查:
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);
}
}
您可以通过拖动列 header 来更改列顺序,或者通过单击 A 或 B 的列 header 来重新排序行以对数据进行排序,但其他单元格显示 row
和 column
提供给渲染器的参数将继续反映它们的视觉位置。
我正在编写一个 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);
}
...
}
单元格渲染器接收视图坐标。这对于为偶数行和奇数行或列不同地着色等非常有用。获取数据并未被视为主要目标,因为实际值已作为参数提供。
如果出于某种原因需要访问模型数据,则必须转换坐标。
您可以使用一个简单的示例程序轻松检查:
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);
}
}
您可以通过拖动列 header 来更改列顺序,或者通过单击 A 或 B 的列 header 来重新排序行以对数据进行排序,但其他单元格显示 row
和 column
提供给渲染器的参数将继续反映它们的视觉位置。