sclass JFileDropTarget extends MetaWithChangeListeners is Swingable { settable S msg = "Drop file here"; // currently dropped file settableWithVar File file; // file can also be null event fileSelected(File file); SingleComponentPanel scp = scp(); *() { varFile().onChange(file -> { updateComponent(); fileSelected(file); }); } cachedVisualize { if (!scp.hasComponent()) scp.setComponent(makeComponent()); ret jHandleFileDrop(l1 setFile, scp); } void updateComponent { scp.setComponent(makeComponent()); } JComponent makeComponent() { var file = file(); ret file == null ? noFileComponent() : componentForFile(file); } JComponent noFileComponent() { ret jcenteredlabel(msg); } swappable JComponent componentForFile(File file) { ret jfullcenter(jFilePathLabel(file).visualize()); } }