srecord noeq JTextFileEditor(File file) is Swingable { JTextArea textArea; JButton btnReload, btnSave; S fileContents, savedText; FileWatchService fileWatcher; ReliableSingleThread rstLoad = rstWithPreDelay(1.0, r _load); cachedVisualize { assertNotNull(file); savedText = fileContents = loadTextFile(file); textArea = wordWrapTypeWriterTextArea(savedText); onChange(textArea, l0updateSaveButton); bindToComponent(textArea, -> { fileWatcher = new FileWatchService; fileWatcher.addListener(file, f -> rstLoad!); rstLoad!; }, -> { dispose fileWatcher; }); ret northAndCenterWithMargin( centerAndEastWithMargin( swing(-> JFilePathLabel(file)), jline( btnSave = disableButton(jbutton("Save", r save)), btnReload = jbutton("Reload", r reload) )), textArea ); } void updateSaveButton { setEnabled(btnSave, !eq(savedText, getText(textArea))); } void save { saveTextFile(file, savedText = getText(textArea)); } void reload { savedText = fileContents; setText(textArea, savedText); } void _load { fileContents = loadTextFile(file); setEnabled(btnReload, !eq(fileContents, savedText)); } }