sclass JChatConvo extends SingleComponentPanel { JAutoWidthHTMLLabel label; L posts = synchroList(); // params = contents, right, contents, right, ... *(O... params) { for (int i = 0; i+1 < l(params); i += 2) addPost(strUnnull(params[i]), isTrue(params[i+1])); setComponent(withMargin(label = swing(() -> jAutoWidthHTMLLabel(lambda0 makeContents)))); } srecord Post(S html, bool right) {} selfType addPost(S html, bool right) { posts.add(new Post(html, right)); update(); this; } void update { label.update(); } S makeContents() { ret htmlForJLabel_chatConvo(cloneMap(posts, p -> pair(p.html, p.right))); } }