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) { printHidingCredentials(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) { fS text = hideCredentials(_text); if (empty(text)) null; logQuotedWithDate(infoBoxesLogFile(), text); if (isHeadless()) null; ret (JWindow) swingAndWait(func { JWindow window = makeWindow(infoMessage_makePanel(text)); window.setSize(300, 150); moveToTopRightCorner(window); if (infoMessage_alwaysOnTop) window.setAlwaysOnTop(true); if (vmBus_noObjections shouldShowInfoBox(window, text)) window.setVisible(true); if (seconds != 0) disposeWindowAfter(iround(seconds*1000), window); ret window; }); } static JWindow infoMessage(Throwable e) { //showConsole(); printStackTrace(e); ret infoMessage(exceptionToStringShort(e)); }