我有一个框架,其中包含从数据库中获取要素的表格(与搜索对应的要素)。这是表格:
public JTable getTableBornes() {
if(TableBornes==null){
TableModel TableBornesModel =
new DefaultTableModel(
new String[][] { { "", "", "" } },
new String[] { "Nom", "X", "Y" });
TableBornes = new JTable();
TableBornes.setModel(TableBornesModel);
TableBornes.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
TableBornes.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
}
return TableBornes;
}
我想要做的是,当用户点击一个单元格并对其进行编辑时,这也必须在数据库上完成。我试图像这样添加一个cellEditor
的监听器:
addBornes.getTableBornes().getCellEditor()
.addCellEditorListener(new CellEditorListener() {
@Override
public void editingStopped(ChangeEvent e) {
try {
for (int i = 0; i < rowsToActOn().length; i++) {
String name = addBornes.getTableBornes()
.getValueAt(rowsToActOn()[i], 0)
.toString();
Double x = new Double(addBornes
.getTableBornes()
.getValueAt(rowsToActOn()[i], 1)
.toString());
Double y = new Double(addBornes
.getTableBornes()
.getValueAt(rowsToActOn()[i], 2)
.toString());
String updateQuery = "UPDATE bornes_salemed_valid SET x='"
+ x
+ "', y='"
+ y
+ "', name='"
+ name
+ "'";
PostgisDataStoreDriver postgisDataStore = (PostgisDataStoreDriver) context
.getWorkbenchContext()
.getRegistry()
.getEntries(
DataStoreDriver.REGISTRY_CLASSIFICATION)
.get(0);
java.sql.Connection connx = postgisDataStore
.getConn();
Statement st;
st = connx.createStatement();
st.executeUpdate(updateQuery);
connx.setAutoCommit(false);
connx.commit();
try {
refreshDataStoreLayerPlugin
.execute(context);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
@Override
public void editingCanceled(ChangeEvent e) {
// TODO Auto-generated method stub
}
});
但是我得到了这个例外:
单元格编辑器为空
我不知道如何申报,究竟在哪里?请帮忙。
java.lang.NullPointerException
at com.vividsolutions.jump.workbench.ui.plugin.specific.ModifierBornesPlugIn.execute(ModifierBornesPlugIn.java:305)
at com.vividsolutions.jump.workbench.plugin.AbstractPlugIn$1.actionPerformed(AbstractPlugIn.java:130)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
答案 0 :(得分:2)
从此代码中删除有关数据库连接的所有代码
什么是CellEditorListener可能不会在没有最深入了解Java,Swing,JTable和XxxTableCelEditor的情况下使用代码
可能的情况
永远不会打开执行关闭在这种情况下飞行连接(长和硬对象),可以在工作线程的背景上打开连接(根本没有重要的EDT)和JTable
将TableModelListener添加到JTable,返回最后编辑过的单元格的正确坐标,
在Editort为XxxTableModel添加新值之前,JTable不会返回上一个值
更好的方法是使用AbstractTableModel,然后你将从setValueAt()中激活另一个后台任务,使用SwingWorker(用于享受)或Runnable #Thread(用于生产代码),请你可以完全忽略我的最后两个内部通信(....)
AbstractTableModel
并且ResultSet.CONCUR_UPDATABLE
直接在模型中实现方法