sclass Tab { S name; } compact module Tabs { new L tabs_actual; transient L tabs; transient JTabbedPane jtabs; start { tabs = notifyingList(tabs_actual, dm_q updateTabs); } visualize { jtabs = jtabs(); updateTabs(); ret withLeftAlignedButtonsAbove(jtabs, "+", rThread { inputText("Name for new tab", voidfunc(S s) { addTab(s) }) }); } void updateTabs { fillJTabs(jtabs, collect name(tabs)); } // API void addTab(S name) { tabs.add(nu(Tab, +name)); } }