2

これは、私が直面している問題の簡単な例です。

私は単純なクラスを持っています:

public class Test{
    Integer a;
    Integer b;

    //getters and setters

    public void getC()
    {
        return a + b;
    }

}

a と b の合計である C というプロパティがあることに注意してください。

次に、これを次のように JTable にバインドします。

List<Test> testList = new ArrayList<Test>();
...add some Test objects to the list
ObservableList observableList = ObservableCollections.observableList(testList);
JTable table = new JTable();
JTableBinding tableBinding = SwingBindings.createJTableBinding(AutoBinding.UpdateStrategy.READ_WRITE, observableList, table); 

次に、次のコードを使用して、テスト オブジェクトの各プロパティ a、b、および c のバインディングを追加します。(これは私が使用する単なる一般的なコードであることに注意してください)

BeanProperty beanProperty = BeanProperty.create(properyName);
JTableBinding.ColumnBinding columnBinding = tableBinding.addColumnBinding(beanProperty);
columnBinding.setColumnName(columnName);
columnBinding.setColumnClass(clazz);
columnBinding.setEditable(editable);

これでテーブルが正しく表示されますが、テーブルの a または b を更新すると問題が発生します。c は a と b から計算されるため、これらの値のいずれかが変更されたときに c が更新されることを期待しています。これは起こりません。

エンティティの新しい値を反映するには、テーブルを更新する必要があると思いますか?

これを実現するために私が何をする必要があるかを誰かが説明できますか? 追加の Bean バインディング プロパティを追加する必要がありますか?

私が使用しているBeanバインディングライブラリは次のとおりです。

<dependency>
  <groupId>org.jdesktop</groupId>
  <artifactId>beansbinding</artifactId>
  <version>1.2.1</version>
</dependency>


org.jdesktop.swingbinding.SwingBindings
4

4 に答える 4

1

参考までに、根本的な問題についてここで説明し、との両方について手動による解決策をここに示します。事実上、変更は、変更された可能性のあるものに変更するか、通知する必要があります。これは、適切なBeanバインディングプロパティの検索に役立つ場合があります。DefaultTableModelAbstractTableModelabTableModelListenerc

于 2013-02-09T02:21:38.713 に答える
1

この質問hereの助けを借りて、JTable の setVale 関数を次のようにオーバーライドすることで、必要な機能を取得できました。

@Override
public void setValueAt(Object value, int row, int col)
{
    super.setValueAt(value, row, col);
    tableBinding.unbind();
    tableBinding.bind();
    revalidate();
}

リードしてくれてありがとう

于 2013-02-10T00:56:49.380 に答える