0

データベースから機能を取得するテーブルを持つフレームがあります(検索に対応する機能)。ここに表があります:

 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

                }
            });

しかし、この例外が発生しています:

セル エディタが null です

それを宣言する方法と正確な場所がわかりません。助けてください。

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)
4

1 に答える 1

2
  • このコードから DB 接続に関するすべてのコードを削除します

  • Java、Swing、JTable、および XxxTableCelEditor に関する深い知識がなければ、おそらくコードを使用しないでください。


可能なシナリオ

  • この場合(長くてハードなオブジェクト)、接続をオンフライで実行して閉じることは決してありません。接続は、JTableとともにワーカースレッド(重要なEDTはまったくありません)からバックグラウンドで開くことができます

  • TableModelListener を JTable に追加し、最後に編集されたセルに適切な座標を返します。

  • Editort が新しい値を XxxTableModel にコミットする前に、JTable が以前の値を返さない

  • AbstractTableModel を使用する方がよい場合は、setValueAt() から別のバックグラウンド タスクを起動し、SwingWorker (楽しむため) または Runnable#Thread (プロダクション コード用) を使用します。 .)


  • モデルに直接メソッドとして実装されている必要があるAbstractTableModelと思いますResultSet.CONCUR_UPDATABLE
于 2013-04-11T11:06:45.040 に答える