-1

多数の行がJTableあり、各行には削除ボタンがあります。その行の削除ボタンをクリックしたときに、現在の行を削除したい。これどうやってするの?

private JButton button;
public MyTableButtonEditor1() {
    button = new JButton("REMOVE");
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            DbUtility ViewEmployee =new DbUtility();
            ViewEmployee.loadDriver();
            ViewEmployee.connect();
            ResultSet rs= ViewEmployee.executeDeleteQuery(Employeeid);
            JOptionPane.showMessageDialog(null, "Employee Removed");
        }
    });
} 

データベース接続

public ResultSet  executeDeleteQuery(String Employeeid ) {

    PreparedStatement pstmt ;
    try {

        pstmt = conn.prepareStatement("DELETE FROM employee  WHERE EmployeeId ="+Employeeid  );


        pstmt.execute();
    }
    catch (SQLException ex){
        // handle any errors
        System.out.println("SQLException: " + ex.getMessage());
        System.out.println("SQLState: " + ex.getSQLState());
        System.out.println("VendorError: " + ex.getErrorCode());
    }
    return rs;
}
4

3 に答える 3

5

Kleoptra からのフィードバックによる更新

ボタンが起動したら、エディターの状態を更新し、セル編集プロセスを停止する必要があります。

public void actionPerformed(ActionEvent e) {

    deleteFlag = true;

    // This needs to be called that the model and table have a chance to
    // reset themselves...
    stopCellEditing();

}

deleteFlagエディターから値を返す必要がありますgetCellEditorValue

public Object getCellEditorValue() {
    return deleteFlag;
}

エディターを初期化するときにフラグをリセットすることを忘れないでください。

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    deleteFlag = false;
    // Set up and return your button...
}

setValueAtモデルでは、テーブルモデルのメソッドをオーバーライドしてイベントをキャプチャする必要があります...

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    switch (columnIndex) {
            case indexOfButtonColumn:
                if (aValue instanceof Boolean && ((Boolean) aValue).booleanValue()) {
                    // Delete row from database...
                    // Update you internal model.  DefaultTableModel has a removeRow
                    // method, if you're using it.

                    // Other wise you will need to update your internal model
                    // and fire the rows delete event in order to update the table...
                    fireTableRowsDeleted(rowIndex, rowIndex);
                }
                break;
    }
}

個人的には、時間のかかるタスクは常にバックグラウンド スレッドまたはワーカーで実行していました。これにより、UI が「ハング」するのを防ぐことができます。

詳細については、Swingでの同時実行をお読みになることをお勧めします。

于 2012-10-09T08:31:39.973 に答える
5

テーブルモデルで行う必要があります。たとえば、使用する場合、そのメソッドjavax.swing.table.DefaultTableModelを呼び出すことができます。removeRow()

于 2012-10-09T08:05:04.560 に答える
3

投稿されたコードにはいくつかのエラーがありますactionPerformed.no for jButton1 と no import for ListSelectionModel.

NetBeans を使用しているようですね?? リスト選択モデルは、設計時にテーブルのプロパティとして設定できます。IDE もactionPerformed(保護されたコードとして) イベントを作成する必要があるため、それがどこに行ったのかわかりません。

model.removeRow(rowid); // this line is all you need 
//table.remove(rowid); <- this line is probably the error 

モデルから削除するだけで十分です。テーブル コンポーネントから削除する必要はありません。java.awt.Componentこの削除はから継承され、テーブルからコンポーネントを削除しようとしていると思い ます。

于 2012-10-09T08:03:45.577 に答える