abstract sclass DynDialogWithUser > DynModule { L dialog = synchroList(); transient JTextArea taDialog; sclass DialogItem { S author, line; long timestamp = now(); toString { ret "[" + localTimeWithSeconds(timestamp) + "] " + author + ": " + line; } } visualize { ret jSection("Dialog", taDialog = jLiveValueWordWrapTypeWriterTextArea_autoScroll(mapLiveValue_f0(func -> S { dialogToString() }, S, dm_fieldLiveValue('dialog)))); } // API S dialogToString() { ret lines_rtrim(allToString(cloneList(dialog))); } void addLine(S author, S line) { dialog.add(nu(DialogItem.class, +author, +line)); } }