!7 sclass Entry { S type, text; } cmodule DialogEditor { transient JPanel stack; L entries = synchroList(); start { onChangeAndNow(r { if (empty(entries) || nempty(last(entries).text)) { entries.add(new Entry); change(); } }); } visualize { stack = dynamicVStack2(); for (Entry e : cloneList(entries)) addAndValidate(stack, makeLine(e)); ret jscroll_trackWidth(stack); } JPanel makeLine(final Entry e) { final JComboBox cb = jcombobox(ai_lineTypes(), e.type); final JTextField tf = jtextfield(e.text); main.onChange(cb, r { e.type = selectedItem(cb); change(); }); main.onChange(tf, r { e.text = gtt(tf); change(); }); ret westAndCenterWithMargin(cb, tf); } }