srecord noeq ScreenSelectorRadioButtons(SimpleLiveValue lvScreenNr) is Swingable { transient ButtonGroup radioButtons; transient SingleComponentPanel scp; settable bool compactLayout; settable bool hideIfOnlyOne; settable S screenLabel = "Screen"; visual swing(-> { if (scp == null) { scp = singleComponentPanel(); awtEveryAndNow(scp, 5.0, r updateScreenCount); } var n = screenCount(); radioButtons = jRadioButtons( countIteratorAsList(n, i -> (compactLayout ? "": screenLabel + " ") + (i+1))); setRadioButtonToolTips(radioButtons, i -> "Select screen " + (i+1)); selectRadioButton(radioButtons, lvScreenNr!); onRadioButtonChange(radioButtons, i -> lvScreenNr.set(i)); scp.setComponent(compactLayout ? hideIfOnlyOne && n == 1 ? null : hstack(flattenList2(nempty(screenLabel) ? jlabel(screenLabel) : null, buttonsInGroup(radioButtons))) : jline(flattenList2(buttonsInGroup(radioButtons)))); ret scp; }); void updateScreenCount() { if (radioButtons != null && radioButtons.getButtonCount() != screenCount()) visualize(); } }