sclass JG22Labels extends MetaWithChangeListeners { settableWithVar bool showCount = true; settableWithVar bool allowCreation = true; settableWithVar L labels; transient JLabel lblInfo = jlabel(); transient JPanel line = jline(); transient ReliableSingleThread rstUpdate = new(r _update); transient settableWithVar JG22Label creating; cachedVisualize { varLabels().onChangeAndNow(rstUpdate); varCreating().onChangeAndNow(rstUpdate); ret borderless(jscrollHorizontal(line)); } void _update { var labels = labels(); removeAllComponents(line); if (showCount) { setText(lblInfo, nLabels(labels) + (empty(labels) ? "" : ":")); line.add(lblInfo); } fOr (label : labels) line.add(makeLabelComponent(label)); if (creating != null) line.add(makeLabelComponent(null)); else if (allowCreation) line.add(jimageButtonScaledToWidth(16, #1103069, "Add a label", r { creating(focusOnFirstShow(new JG22Label)) })); revalidate(line); } JG22Label makeLabelComponent(G22Label label) { ret new JG22Label(label); } }