// action can be Runnable or a function name static JButton jThreadedButton(fS text, fO action) { ret swing(func -> JButton { S text2 = dropPrefix("[disabled] ", text); final JButton btn = new JButton(text2); if (l(text2) < l(text)) btn.setEnabled(false); btn.setToolTipText(btn.getText()); if (action != null) btn.addActionListener(actionListenerInNewThread(action, btn)); ret btn; }); }