void () { if (popup != null || !source.isEnabled()) return; Content content = prepare(source, onShow); JComponent component = content.getContentComponent(); Dimension size = component.getPreferredSize(); if (size.width - 50 < source.getWidth()) size.width = source.getWidth(); if (size.height < 2 * source.getHeight()) size.height = 2 * source.getHeight(); Point location = new Point(0, 0); SwingUtilities.convertPointToScreen(location, source); Rectangle screen = ScreenUtil.getScreenRectangle(source); int bottom = screen.y - location.y + screen.height; if (bottom < size.height) { int top = location.y - screen.y + source.getHeight(); if (top < bottom) { size.height = bottom; } else { if (size.height > top) size.height = top; location.y -= size.height - source.getHeight(); } } component.setPreferredSize(size); popup = JBPopupFactory .getInstance() .createComponentPopupBuilder(component, content.getFocusableComponent()) .setMayBeParent(true) // this creates a popup as a dialog with alwaysOnTop=false .setFocusable(true) .setRequestFocus(true) .setTitle(title) .setAdText(comment) .setLocateByContent(true) .setCancelOnWindowDeactivation(false) .setKeyboardActions(singletonList(Pair.create(event -> { collapse(); Window window = ComponentUtil.getWindow(source); if (window != null) { window.dispatchEvent( new KeyEvent(source, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), CTRL_MASK, KeyEvent.VK_ENTER, '\r')); } }, getKeyStroke(KeyEvent.VK_ENTER, CTRL_MASK)))) .setCancelCallback(() -> { try { content.cancel(onHide); popup = null; return true; } catch (Exception ignore) { return false; } }).createPopup(); if (!ApplicationManager.getApplication().isHeadlessEnvironment()) { popup.show(new RelativePoint(location)); } }