首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TableCellEditor#getTableCellEditorComponent()是否接收视图坐标的行和列索引?

TableCellEditor#getTableCellEditorComponent()是否接收视图坐标的行和列索引?
EN

Stack Overflow用户
提问于 2020-11-12 16:25:03
回答 1查看 39关注 0票数 1

我正在编写一个需要从底层TableModel获取一些数据的TableCellEditor实现。为此,我需要TableModel的行和列索引。

我想知道的是getTableCellEditorComponent()接收的索引是视图坐标还是模型坐标。换句话说,以下代码中的table.convertRowIndexToModel()table.convertColumnIndexToModel()调用是必要的吗?或者直接将这些索引传递给model.getValueAt()可以吗?

代码语言:javascript
复制
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);
    }
   ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-12 18:57:52

单元格渲染器接收视图坐标。这对于以不同的方式给偶数和奇数行或列着色等操作很有用。获取数据并不是主要目标,因为实际值已经作为参数提供。

如果出于某种原因需要访问模型数据,则必须转换坐标。

您可以通过一个简单的示例程序轻松检查这一点:

代码语言:javascript
复制
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的列标题来对行进行重新排序来对数据进行排序,但显示提供给渲染器的rowcolumn参数的其他单元格将继续反映它们的视觉位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64800259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档