RelativePoint (@NotNull JLayeredPane layeredPane, @NotNull Rectangle bounds) { Dimension size = getSizeForPositioning(); List<Supplier<Point>> optionsToTry = Arrays.asList(() -> new Point(bounds.x + bounds.width, bounds.y), () -> new Point(bounds.x - size.width, bounds.y)); for (Supplier<Point> option : optionsToTry) { Point location = option.get(); SwingUtilities.convertPointToScreen(location, layeredPane); Point adjustedLocation = fitToScreenAdjustingVertically(location, size); if (adjustedLocation != null) return new RelativePoint(adjustedLocation).getPointOn(layeredPane); } setDimensionServiceKey(null); // going to cut width Point rightTopCorner = new Point(bounds.x + bounds.width, bounds.y); final Point rightTopCornerScreen = (Point)rightTopCorner.clone(); SwingUtilities.convertPointToScreen(rightTopCornerScreen, layeredPane); Rectangle screen = ScreenUtil.getScreenRectangle(rightTopCornerScreen.x, rightTopCornerScreen.y); final int spaceOnTheLeft = bounds.x; final int spaceOnTheRight = screen.x + screen.width - rightTopCornerScreen.x; if (spaceOnTheLeft > spaceOnTheRight) { myComponent.setPreferredSize(new Dimension(spaceOnTheLeft, Math.max(size.height, JBUIScale.scale(200)))); return new RelativePoint(layeredPane, new Point(0, bounds.y)); } else { myComponent.setPreferredSize(new Dimension(spaceOnTheRight, Math.max(size.height, JBUIScale.scale(200)))); return new RelativePoint(layeredPane, rightTopCorner); } }