问题描述
我正在使用此代码保存 JTable
内容:
I'm saving JTable
content with this code:
@override
public void editingStopped(ChangeEvent ce) {
PreparedStatement pstmt = null;
try {
int row = getEditingRow();
int column = getEditingColumn();
DefaultStyledDocument doc = (DefaultStyledDocument) getCellEditor().getCellEditorValue();
doc.setDocumentFilter(null);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject((DefaultStyledDocument) doc);
oos.flush();
byte[] data = bos.toByteArray();
oos.close();
bos.close();
String query = "update BOX_ROWS "
+ "set COLUMN1= ? "
+ "where BOX_ID=" + ID
+ " and INDEX=" + row;
pstmt = ReseachAssistantUI.conn.prepareStatement(query);
pstmt.setObject(1, data);
pstmt.executeUpdate();
doc.setDocumentFilter(new MyDocumentFilter());
} catch (SQLException ex) {
Logger.getLogger(MyTable.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
JOptionPane.showMessageDialog(null, "MyTable - " + ex.getMessage());
} catch (IOException ex) {
Logger.getLogger(MyTable.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
JOptionPane.showMessageDialog(null, "MyTable - " + ex.getMessage());
} finally {
DBUtil.closePreparedStatement(pstmt, MyTable.class.getName());
}
super.editingStopped(ce);
}
,它在Windows 上运行正常。但是,当我运行我的应用程序在Mac OS X 时,出现以下消息:
and it runs fine on Windows. However when I run my app on Mac OS X the following message appears:
MyTable - com.apple.laf .AquaComboBoxUI
表弹出式编辑器在工具栏上有两个组合框,但我看不到他们要做什么这个例外。有人知道为什么会抛出这个异常吗?序列化对象的方式有问题吗?
The table pop up editor does have 2 comboboxes on a tool bar, but I can't see what they have to do with this exception. Does anyone know why does it throw this exception? Is there something wrong with the way I serialize the object?
推荐答案
看起来你正在努力坚持一个编辑之后更改的单元格结束,但更新模型之前。这个概述了正常的事件顺序。如您所见,实际的编辑器组件可能因平台而异。而不是覆盖 JTable#editingStopped()
,覆盖 TableModel#setValueAt()
,您知道更新单元格的行,列和类型。可以在和。相关说明使用 JComboBox
作为 CellEditor
。
It looks like you're trying to persist the contents of a changed cell after editing concludes but before the model is updated; this answer outlines the normal sequence of events. As you have found, the actual editor component may vary by platform. Instead of overriding JTable#editingStopped()
, override TableModel#setValueAt()
, where you know the row, column and type of the updated cell. Examples may be found here and here. This related example illustrates using a JComboBox
as a CellEditor
.
这篇关于这段代码有什么问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!