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); cachedVisualize { varLabels().onChangeAndNow(rstUpdate); ret 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 (allowCreation) line.add(jimageButtonScaledToWidth(16, #1103069, "Add a label", r addALabel)); } JG22Label makeLabelComponent(G22Label label) { ret new JG22Label(label); } void addALabel() swing { line.add(new G22Label); } }