static A onChange(A spinner, O r) { ret onChange(spinner, toRunnable(r)); } static A onChange(A spinner, Runnable r) { if (r != null) swing { spinner.addChangeListener(changeListener(r)); } ret spinner; } static A onChange(A b, Runnable r) { swing { b.addItemListener(itemListener(r)); } ret b; } svoid onChange(JTextComponent tc, Runnable r) { onUpdate(tc, r); } static A onChange(A slider, Runnable r) { swing { slider.addChangeListener(changeListener(r)); } ret slider; } static JComboBox onChange(JComboBox cb, ChangeTriggerable r) { ret onChange(cb, new ChangeTrigger(r)); } static JComboBox onChange(JComboBox cb, Updateable r) { ret onChange(cb, new UpdateTrigger(r)); } static JComboBox onChange(JComboBox cb, IVF1 f) { if (f != null) addActionListener(cb, -> f.get(getSelectedItem_typed(cb))); ret cb; } // Note: JComboBox also supports addActionListener. // Not sure if that would help us any. static JComboBox onChange(JComboBox cb, Runnable r) { if (isEditableComboBox(cb)) onChange(textFieldFromComboBox(cb), r); else onSelectedItem(cb, runnableToIVF1(r)); ret cb; } static A onChange(A tabs, Runnable r) { swing { tabs.addChangeListener(changeListener(r)); } ret tabs; } static A onChange(Runnable r, A cc) { if (cc != null && r != null) swing { cc.getSelectionModel().addChangeListener(changeListener(r)); } ret cc; } static A onChange(A a, ChangeTriggerable b) { if (a != null && b != null) a.onChange(new ChangeTrigger(b)); ret a; } static A onChange(A a, Updateable b) { if (a != null && b != null) a.onChange(new UpdateTrigger(b)); ret a; } static A onChange(A a, Runnable r) { if (a != null && r != null) a.onChange(r); ret a; }