使JTable中的单元格可编辑 - 单元格的默认值

时间:2009-01-26 02:51:15

标签: java jtable

我正在使用Java,我正在努力使JTable中的单元格可编辑。我的类实现了TableModel并扩展了AbstractTableModel(因此我可以使用方法fireTableCellUpdated(rowIndex, columnIndex)),并且我已经实现了方法isCellEditable()setValueAt()。 我将表中的单个单元格表示为Cell类的对象。

现在这是我的问题:单元格已经可编辑,当我单击它时,光标会出现在单元格中,但是,单元格中还会出现一个字符串,如下所示:Cell@1e63e3d。我删除了这个字符串,并在单元格中放入了我要放置的值,然后单击Enter,它工作正常。但是当我点击那里的单元格时,我想要一个空字符串,而不是Cell@1e63e3d。我不知道如何将此空字符串设置为默认值和位置。

我的Cell类存储有关单元格的信息(特征),如单元格的颜色,以及它作为实例变量的值。

如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:7)

您是否为TableCellRenderer设置了TableCellEditorJTable

要显示单元格TableCellRenderer用于呈现TableModel中某个位置的内容。默认情况下,它将使用该位置toString的{​​{1}}方法,以便解释单元格中显示的Object - 这是{{1}的结果在Cell@1e63e3d对象上调用方法。

通过编写自定义单元格渲染器(实现toString的类),您将能够返回要用于显示Cell对象的TableCellRenderer,使用getTableCellRendererComponent方法。在您的情况下,您可能希望子类化实现Component的{​​{1}},并将设置标签的内容以反映Cell对象的内容。

至于编辑单元格,当JLabel想要编辑TableCellRenderer中的单元格时,Cell会收到TableCellEditor的{​​{1}} }。 Object将返回TableModel,用于使用getTableCellEditorComponent方法编辑单元格内容(JTable)。

在您提供的情况下,我认为制作实现TableCellEditor界面的Component将能够为您完成工作。当您覆盖Object时,请检查您是否有JTextField对象的实例(即TableCellEditor),如果是这种情况,请初始化您的getTableCellEditorComponent以包含您想要显示或编辑的Cell对象。

推荐阅读:我发现IBM developerWorks上的Rendering cells in Swing's JTable component文章非常有助于学习如何处理object instanceof Cell及其单元格渲染和编辑功能。特别是,Creating custom renderersEditiing table cells部分可能会引起关注。

答案 1 :(得分:1)

您是否使用适当的TableCellEditor来显示要编辑的组件?

class MyTableCellEditor
        extends DefaultCellEditor
{
    @Override
    public Component getTableCellEditorComponent(
            JTable table,
            Object value,
            boolean isSelected,
            int row,
            int column)
    {
        final JTextField c = (JTextField) super.getTableCellEditorComponent(
            table,
            ((Cell) value).text, // edit the text field of Cell
            isSelected,
            row,
            column);

        c.selectAll(); // automatically select the whole string in the cell
        return c;
    }
}

除自定义单元格渲染器外,您还需要告诉表格使用此自定义单元格编辑器。

myTable.setDefaultEditor(Cell.class, new MyTableCellEditor());