static bool flatInfoBox_alwaysOnTop = true; static double flatInfoBox_defaultTime = 2.0; static int flatInfoBox_x = 28, flatInfoBox_y = 5; // automatically switches to AWT thread for you static JWindow flatInfoBox(S text) { ret flatInfoBox(text, flatInfoBox_defaultTime); } static JWindow flatInfoBox(final S text, final double seconds) { if (empty(text)) null; print(text); ret flatInfoBox_noprint(text, seconds); } static JWindow flatInfoBox_noprint(S text) { ret flatInfoBox_noprint(text, flatInfoBox_defaultTime); } static JWindow flatInfoBox_noprint(final S text, final double seconds) { if (empty(text)) null; logQuotedWithDate(infoBoxesLogFile(), text); if (isHeadless()) null; ret (JWindow) swingAndWait(func { final JWindow window = makeUnimportantWindow(flatInfoBox_makePanel(text)); window.pack(); window.setBounds(flatInfoBox_x, flatInfoBox_y, 300, window.getHeight()); if (flatInfoBox_alwaysOnTop) window.setAlwaysOnTop(true); window.setVisible(true); disposeWindowAfter(iround(seconds*1000), window); ret window; }); } static JWindow flatInfoBox(Throwable e) { showConsole(); printStackTrace(e); ret flatInfoBox(exceptionToStringShort(e)); }