JTableBindingとTableModelListener
JTableを使ったアプリケーションを作る場合、JTable(TableModel)上のデータが変更されたことを検知する必要があるケースが多いが、その場合TableModelListenerを使える。
table.getModel().addTableModelListener(new TableModelListener(){ @Override public void tableChanged(TableModelEvent e) { System.out.println("table model changed"); }});
がしかし、BeansBindingによりJTableをJavaBeansにバインドするとTableModelの制御がJTable(DefaultTableModel)からJTableBinding(BindingTableModel)に移るせいか、なぜかTableModelListenerの通知が行われなくなってしまうのだ。※
list = ObservableCollections.observableList(query.getResultList()); JTableBinding binding = SwingBindings.createJTableBinding(UpdateStrategy.READ_WRITE, list, masterTable);
これを知ってか知らずか、NetBeans6.5βが生成するデータベースアプリケーションの雛形のコードは変更の検知にTableModelListenerを使わず、代わりにBindingListenerを使用している。
bindingGroup.addBindingListener(new AbstractBindingListener() { @Override public void targetChanged(Binding binding, PropertyStateEvent event) { // save action observes saveNeeded property setSaveNeeded(true); } });
元々GUIであるJTableが特定のTableModelに依存している事自体、設計としてあまり好きではないのだが、それよりなにより本来起きるはずのイベントが追加したライブラリィが原因で起きなくなってしまうというのは気に入らない。
※必ず、ということまでは検証していない。私の環境だけの現象かもしれないことをお断りしておく。