BeansBindingとDocumentFiler
またまたBeansBindingネタ。
以下のような関係でBeansBindingを設定したアプリケーションがある。
List<-> JTable <-> JTable#Column <-> JTextField
JTextFieldにはDocumentFilterを介して入力文字と長さのチェックを行っている。
この状態でJTableの特定のセルをクリックすると、以下のスタックで再帰呼び出しになってしまう。(関係の無いトレースは端折っている)
AbstractDocument$DefaultFilterBypass.replace(int, int, String, AttributeSet) 行: 3101 PlainDocument(AbstractDocument).replace(int, int, String, AttributeSet) 行: 647 JTextField(JTextComponent).setText(String) 行: 1693 JTextComponentAdapterProvider$Adapter.setText(String) 行: 50 BeanProperty.invokeMethod(Method, Object, Object...) 行: 782 BeanProperty.write(Object, Object, String, Object) 行: 891 BeanProperty.setValue(S, V) 行: 571 AutoBinding(Binding ).refreshUnmanaged() 行: 1229 AutoBinding (Binding ).refresh() 行: 1207 AutoBinding .tryRefreshThenSave() 行: 162 AutoBinding .sourceChangedImpl(PropertyStateEvent) 行: 227 AutoBinding (Binding ).sourceChanged(PropertyStateEvent) 行: 1411 Binding .access$3(Binding, PropertyStateEvent) 行: 1404 Binding$PSL.propertyStateChanged(PropertyStateEvent) 行: 1618 ELProperty (PropertyHelper).firePropertyStateChange(PropertyStateEvent) 行: 212 ELProperty.notifyListeners(boolean, Object, ELProperty) 行: 688 ELProperty.access$8(ELProperty, boolean, Object, ELProperty$SourceEntry) 行: 664 ELProperty$SourceEntry.processSourceChanged() 行: 312 ELProperty$SourceEntry.sourceChanged(Object, String) 行: 326 ELProperty$SourceEntry.propertyChange(PropertyChangeEvent) 行: 333 PropertyChangeSupport.firePropertyChange(PropertyChangeEvent) 行: 339 PropertyChangeSupport.firePropertyChange(String, Object, Object) 行: 276 JTableAdapterProvider$Adapter(BeanAdapterBase).firePropertyChange(Object, Object) 行: 112 JTableAdapterProvider$Adapter$Handler.tableSelectionChanged() 行: 81 JTableAdapterProvider$Adapter$Handler.valueChanged(ListSelectionEvent) 行: 91 DefaultListSelectionModel.fireValueChanged() 行: 194 DefaultListSelectionModel.changeSelection(int, int, int, int) 行: 398 DefaultListSelectionModel.setSelectionInterval(int, int) 行: 442 JTable.changeSelectionModel(ListSelectionModel, int, boolean, boolean, boolean, int, boolean) 行: 2295 JTable.changeSelection(int, int, boolean, boolean) 行: 2364 BasicTableUI$Handler.mousePressed(MouseEvent) 行: 1014
DocumentFilterでよくやるミスとしてオーバライドしたメソッド中からDocumentFilter.FilterBypassを呼び出さずにスーパクラスのメソッドを呼び出してしまうことだが、当然それはチェック済み。
いい加減嫌になってきた。