2

だから私はJTable、列AKを持っています。ABだけが編集可能です。誰かがAの空の行を編集した場合、 Bを取得するために API 呼び出しを行い、次にBが存在するすべての行を取得するために DB 呼び出しを行います。誰かがBの空の行を編集した場合、同じ呼び出しを行います。その行のDBからも。この呼び出しは 0 ~ N 行を返します。0 行が返された場合、Bを除くすべての行の値を変更しますそれ以外の場合は、データを使用して行に入力します。入力したら、すべての列を編集不可にします。DB 呼び出しは独自のスレッドで発生します。呼び出しが返されると、テーブルモデルに追加する独自のレコード オブジェクトを作成します。

私は、データを保持し、値の変更を処理するために、独自のTableModelとを持っています。TableModelListener

これが私の問題です。セルレンダラーを使用TableCellRendererして値が変更されたかどうかを確認しています。変更されている場合は、呼び出しを行い、必要に応じて入力します。DB から多数の行が取得されている場合、すべてのレコードを読み込んで作成するのに時間がかかるため、画面がフリーズしているだけでなく、進行中であり、どれだけ進んでいるのかをユーザーに示すために a を使用しようとしました。ただし、表示されるフレームは空白で何も表示されません。何かを不適切に行っているか、何かが欠けているように感じます。どんな助けでも大歓迎です。ProgressBar

私が話していることを理解するためのいくつかのコード

public class MyPanel extends JPanel {
    private JTable myTable;
    private MyTableModel tm;
    //OTHER FIELDS

    public static void createPanel() {
           tm = new MyTableModel(columnnames);
           myTable = new JTable(tm);

           TableColumn account = myTable.getColumnModel().getColumn(
            MyTableModel.ACCOUNT_INDEX);
    account.setCellRenderer(new MyTableRenderer(
            MyTableModel.ACCOUNT_INDEX));
    }
}

public class MyTableRenderer extends DefaultTableCellRenderer{

   protected int interactiveColumn;

   public MyTableRenderer(int interactiveColumn) {
        this.interactiveColumn = interactiveColumn;
    }

   public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component c = super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);
        if (column == interactiveColumn && hasFocus) {
             //DO DB and API CALLS HERE
             //IF DB CALL DISPLAY A NEW FRAME WITH PROGRESSBAR
        }
        return c;
   }
}

フォーマットの問題で申し訳ありません

4

1 に答える 1

4

を使用すると、結果セットを調べSwingWorkerながら更新できます。TableModel

TableModel補遺:レンダラーからを更新しようとしないでください。の実装CellEditorが終了したら、 で適切なワーカーを開始することにより、モデルを更新できますgetCellEditorValue()。このようにして、変更されたセルに対してレンダラーが次に呼び出されたときに、変更されたデータが使用可能になります。この関連するは、アプローチの概要を示しています。

補遺:getCellEditorValue()編集が終了した後に呼び出されますが、ワーカーを開始するsetValueAt()と、ターゲットの行と列へのアクセスがより確実になります。

于 2012-04-12T00:02:03.887 に答える