我正在使用Java,我正在努力使JTable中的单元格可编辑。我的类实现了TableModel并扩展了AbstractTableModel(因此我可以使用方法fireTableCellUpdated(rowIndex, columnIndex))
,并且我已经实现了方法isCellEditable()
和setValueAt()
。
我将表中的单个单元格表示为Cell类的对象。
现在这是我的问题:单元格已经可编辑,当我单击它时,光标会出现在单元格中,但是,单元格中还会出现一个字符串,如下所示:Cell@1e63e3d
。我删除了这个字符串,并在单元格中放入了我要放置的值,然后单击Enter,它工作正常。但是当我点击那里的单元格时,我想要一个空字符串,而不是Cell@1e63e3d
。我不知道如何将此空字符串设置为默认值和位置。
我的Cell类存储有关单元格的信息(特征),如单元格的颜色,以及它作为实例变量的值。
如果您需要更多信息,请告诉我。
答案 0 :(得分:7)
您是否为TableCellRenderer
设置了TableCellEditor
和JTable
?
要显示单元格,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 renderers和Editiing 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());