2

チェックボックスとして描画されたいくつかの列を持つ JTable があります。私がしたいのは、列 B の対応するチェックボックスをオン/オフにして、列 A のチェックボックスを有効/無効にすることです。

この例に基づいてなんとかできましたが、新しく有効化/無効化されたチェックボックスに問題があり、正しく更新されません。最後に有効/無効にしたチェックボックスは、テーブル内の他のセルをクリックした後にのみ更新されます。

問題は次のようになります (「参照構造」列は、チェックボックスが有効/無効になっている列です):

チェックボックスが有効になっていません:

チェックボックスが有効になっていません

チェックボックスが無効になっていません:

チェックボックスが無効になっていません

これは私の JTable コードです:

public class StructuresJTable extends JTable {

public StructuresJTable() {
    super();
}

public StructuresJTable(TableModel dm) {
    super(dm);
}

@Override
public Component prepareRenderer(TableCellRenderer renderer, int row,
        int col) {
    Component c = super.prepareRenderer(renderer, row, col);
    if (col == StructuresTableModel.COMPARISON_REF_STRUCT_COL) {
        c.setEnabled((Boolean) this.dataModel.getValueAt(row,
                StructuresTableModel.COMPARE_COL));
    } else {
        c.setEnabled(true);
    }
    return c;
}

}

それを機能させる方法について何か提案はありますか?

4

2 に答える 2

3

更新: 使用することprepareRenderer()と実装するTableCellRendererことは、モデルを正しく調整することほど重要ではありません。モデルが正しければ、ビューが続きます。適切なモデルレンダラー、およびエディターが必要です。

  • モデル: 各セルの状態を保持するためのデータ構造が必要です。の実装ではTableModel、オーバーライドsetValueAt()して、変更が発生したときにモデル内の各セルの望ましい状態を調整します。

  • レンダラー:で、モデルで指定されているように各セルのレンダラーを調整するためTableCellRendererにオーバーライドします。getTableCellRendererComponent()

  • 編集者:ここでDefaultCellEditorは暗黙的に使用されているで十分です。

于 2012-06-29T03:09:18.847 に答える
2

私はあなたのコードを見ていませんが、一般に、Swing テーブル、リスト、およびツリーでは、レンダラー インスタンスを再利用して多くの行を描画します。関連する行を再描画できるように、内容が変更されたことを JTable に通知する必要があります。モデルを使用して、一部の行が変更されたことをその TableModelListeners に通知します。

于 2012-06-29T01:51:21.760 に答える