3

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

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

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

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

4

2 回答 2

7

你设置了一个TableCellRendererTableCellEditor你的JTable

为了显示一个单元格TableCellRenderer用于呈现一个位置的内容TableModel。默认情况下,它将使用该位置的toString方法Object,这样就可以解释Cell@1e63e3d单元格中显示的内容——这是toString在您的Cell对象上调用该方法的结果。

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

至于编辑单元格,当您要编辑单元格时,会TableCellEditor收到Object来自的。将返回 a ,用于使用该方法编辑单元格内容( )。TableModelJTableTableCellEditorComponentObjectgetTableCellEditorComponent

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

推荐阅读:我发现来自 IBM developerWorks的 Swing 的 JTable 组件文章中的 Rendering cells 对学习如何处理JTables 及其单元渲染和编辑特性很有帮助。特别是,创建自定义渲染器编辑表格单元格部分可能很有趣。

于 2009-01-26T03:38:48.977 回答
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());
于 2009-01-26T03:32:27.213 回答