Hi Thiago, I ran this on Windows. My monitor setup is:
Left: 3840x2160 (150%) -- top left coordinate (-2560, 0) (-2560 because of scaling) Middle: 3840x2160 (150%) -- this one has a top left coordinate of (0, 0) Right: 1920x1200 (100%) -- this one has a top left coordinate of (2560, 0) When started, the program appeared perfectly centered on the middle screen. Your program showed buttons: 4480 and 3520 The 4480 button moved the Window far too the right, off screen and I had to stop the program The 3520 button moved the Window to the Right monitor, but it was not centered nicely. I added a `peek(System.out::println)` on the screens stream. These are my screens: Rectangle2D [minX=0.0, minY=0.0, maxX=2560.0, maxY=1440.0, width=2560.0, height=1440.0] Rectangle2D [minX=2560.0, minY=-194.0, maxX=4480.0, maxY=1006.0, width=1920.0, height=1200.0] Rectangle2D [minX=-2560.0, minY=6.0, maxX=0.0, maxY=1446.0, width=2560.0, height=1440.0] --John On 09/04/2025 12:55, Thiago Milczarek Sayão wrote: > Hi, > > Could anyone with a multi-screen setup on Mac and/or Windows please > share the results of the two buttons on this sample app? Your feedback > would be greatly appreciated! > > On Ubuntu 24.04 the first button moves the Stage to the end of the > first screen (bit weird). > The second work as expected, it gets moved to the start of the center > of the last screen. > > Thanks! > > import javafx.application.Application; > import javafx.geometry.Pos; > import javafx.geometry.Rectangle2D; > import javafx.scene.control.Button; > import javafx.scene.layout.VBox; > import javafx.stage.Screen; > import javafx.stage.StageStyle; > import javafx.application.Platform; > import javafx.scene.Scene; > import javafx.scene.layout.StackPane; > import javafx.scene.paint.Color; > import javafx.stage.Stage; > > import java.util.Comparator; > > public class TestScreenBounds extends Application { > > @Override > public void start(Stage stage) { > stage.setTitle("Move Outside Bounds"); > Rectangle2D bounds = Screen.getScreens().stream() > .map(Screen::getBounds) > > .sorted(Comparator.comparingDouble(Rectangle2D::getMaxX).reversed()) > .findFirst() > .orElseThrow(); > > Button btn = new Button("Move To " + bounds.getMaxX()); > btn.setOnAction(event -> stage.setX(bounds.getMaxX())); > > double middleLastScreen = bounds.getMinX() + bounds.getWidth() / 2; > > Button btn2 = new Button("Move To " + middleLastScreen); > btn2.setOnAction(event -> stage.setX(middleLastScreen)); > > VBox root = new VBox(btn, btn2); > root.setFillWidth(true); > root.setAlignment(Pos.CENTER); > Scene scene = new Scene(root, 300, 300); > stage.setScene(scene); > stage.show(); > } > > public static void main(String[] args) { > launch(TestScreenBounds.class, args); > } > } >