0

JTable のセル値の更新中に問題が発生しました。私がやりたいことは、JTable から特定のセルを選択した後、編集できるようにすることであり、アクションはバックエンドのデータベースを反映する必要があります。HSQLを使用しています。私のテーブルには、1 つの PK を持つ 4 つの列があります。代替案を教えてください。また、* を置き換えてコードを提供してください。私はちょうど初心者です。

d_view.addActionListener(new ActionListener() { //----action listener of a button
    public void actionPerformed(ActionEvent po) {
        try {
            Connection connec;
            Class.forName("org.hsqldb.jdbcDriver");
            connec = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/","SA", "");
            java.sql.Statement stt=connec.createStatement();
            ResultSet rs=stt.executeQuery("select * from DepReg");//----------TO VIEW DATA IN TABULAR FORMAT
            ResultSetMetaData rt=rs.getMetaData();
            int cols=rt.getColumnCount();
            String c[] =new String[cols];
            for(int i=0;i<cols;i++){
                c[i]=rt.getColumnName(i+1);
                dm.addColumn(c[i]);
            }
              Object row[]=new Object[cols];
                while(rs.next()){
                     for(int i=0;i<cols;i++){
                            row[i]=rs.getString(i+1);
                        }
                    dm.addRow(row);
                }
                table.setModel(dm);
                connec.close();
            }
        catch (Exception ty) {}
    }
});//--------HERE THE PROBLEM STARTS
table.getModel().addTableModelListener(new TableModelListener() {
    public void tableChanged(TableModelEvent tme) {
        int rows=tme.getFirstRow();
        int colms=tme.getColumn();
        TableModel model=(TableModel)tme.getSource();
        String colname=model.getColumnName(colms);
        Object data=model.getValueAt(rows, colms);
//*********EDIT/REPLACE THE CODE ***************//
        try {
            Connection connec;
            Class.forName("org.hsqldb.jdbcDriver");
            connec = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/","SA", "");
            java.sql.Statement stt=connec.createStatement();
//-----------I WILL INCLUDE AN UPDATE STATEMENT OVER HERE BASED ON THE VALUE SELECTED
        }
        catch (Exception ae) {}
        }
});
4

1 に答える 1

2
  • イベント ディスパッチ スレッドでデータベース接続が発生しないようにする必要があります。それらは単に遅すぎます。それをバックグラウンド スレッドに移動します。詳細については、Swing 同時実行のチュートリアルを参照してください。
  • すでにテーブルを編集できるかどうかは完全にはわかりませんが、そうでない場合は、編集可能にしたいセルに対してTableModelメソッドisCellEditableが返され、trueTableCellEditorJTable
  • データベースを更新するために を追加する代わりに、TableModelListenerそのロジックをカスタム に移動しますTableModel。メソッドが呼び出されるたびに、setValueAt変更が行われたことがわかります。その後、データベースを更新できます (ここでも、イベント ディスパッチ スレッドではありません)。
  • データベースを他の場所からも更新できる場合は、特定の時点でデータベースをポーリングして、データベースTableModelの最新の状態を反映するように更新することをお勧めします。必ずワーカー スレッドでポーリングを行ってください。次に、ワーカー スレッドでまったく新しい を作成し、イベント ディスパッチ スレッドでテーブルのTableModelを置き換えることができます。TableModelまたは、EDT で既存のモデルを更新することもできます (イベントを発生させることを忘れないでください。モデルが拡張されている場合は、利用可能な API を使用できます) DefaultTableModelAbstractTableModel

詳細について は、 Swing テーブルのチュートリアルを読むこともお勧めします。

于 2012-10-03T06:07:09.473 に答える