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を呼び出さずにスーパクラスのメソッドを呼び出してしまうことだが、当然それはチェック済み。

いい加減嫌になってきた。