static bool infoMessage_alwaysOnTop = true; static double infoMessage_defaultTime = 5.0; // automatically switches to AWT thread for you static JWindow infoMessage(S text) { ret infoMessage(text, infoMessage_defaultTime); } static JWindow infoMessage(final S text, final double seconds) { print(text); ret infoMessage_noprint(text, seconds); } static JWindow infoMessage_noprint(S text) { ret infoMessage_noprint(text, infoMessage_defaultTime); } static JWindow infoMessage_noprint(final S text, final double seconds) { if (isHeadless()) null; ret (JWindow) swingAndWait(func { final JWindow window = showWindow(infoMessage_makePanel(text)); window.setSize(300, 150); moveToTopRightCorner(window); if (infoMessage_alwaysOnTop) window.setAlwaysOnTop(true); window.setVisible(true); disposeWindowAfter(iround(seconds*1000), window); ret window; }); } static JWindow infoMessage(Throwable e) { showConsole(); printStackTrace(e); ret infoMessage(exceptionToStringShort(e)); }