自定义标题栏拖动行为不支持 window 对齐

Custom titlebar drag behaviour does not support window snap

虽然这个 Whosebug post 有助于解决拖动问题 How to drag an undecorated window (stage) of JavaFX

它绝对不会让 window snap 工作,有什么方法可以让 window snap 工作吗?

这是您可以尝试的单个 Class javafx 应用程序。你可以拖动绿色圆圈的舞台,关闭红色圆圈的应用程序。当 stage.getX==0 位于屏幕左侧并且应用程序在屏幕的 maxHeight 处调整大小时 Screen.getPrimary().getBounds().getMaxY()Screen.getPrimary().getBounds().getMaxX() 除以二以获得屏幕的一半宽度.当 stage.getX() 加上 window 的当前宽度匹配时,右侧有点棘手 Screen.getPrimary().getBounds().getMaxY() 意味着 window 的右侧到达屏幕的右侧,但是当应用程序在其 x 坐标更改的右侧重新调整时,这将再次触发侦听器,以避免我放置布尔值 boolean isInRightSide。您可以评论和取消评论该布尔值以查看该行为。舞台 x 位置的任何其他值将重置为原始大小。

public class App extends Application {

boolean isInRightSide = false;
double offsetX;
double offsetY;
int defaultWidth = 640;
int defaultHeight = 480;

@Override
public void start(Stage stage) {
    double screenMaxX = Screen.getPrimary().getBounds().getWidth();
    System.out.println(Screen.getPrimary().getBounds());

    Circle dragCircle = new Circle(30, new Color(0, 1, 0, 1));
    Circle closeCircle = new Circle(30, new Color(1, 0, 0, 1));
    HBox hBox = new HBox(dragCircle, closeCircle);
    closeCircle.setOnMouseClicked(e -> stage.close());

    hBox.setAlignment(Pos.TOP_RIGHT);

    dragCircle.setOnMousePressed(e -> {

        
            offsetX = e.getSceneX();
            offsetY = e.getSceneY();
        

    }
    );

    dragCircle.setOnMouseDragged(e -> {

        stage.setX(e.getScreenX() - offsetX);
        stage.setY(e.getScreenY() - offsetY);
        e.consume();
    });

    // sanap to left  and right 
    stage.xProperty().addListener(e -> {

        if (stage.getX() + defaultWidth > screenMaxX) {
            stage.setX(screenMaxX - defaultWidth);

        }

        if (stage.getX() <= 0 && !stage.isFullScreen()) {
            stage.setHeight(Screen.getPrimary().getBounds().getMaxY());
            stage.setWidth(Screen.getPrimary().getBounds().getMaxX() / 2);

        } else if (!isInRightSide) {
            stage.setHeight(defaultHeight);
            stage.setWidth(defaultWidth);
        }
        if (stage.getX() + defaultWidth == screenMaxX) {
            isInRightSide = true;

            stage.setHeight(Screen.getPrimary().getBounds().getMaxY());
            stage.setWidth(Screen.getPrimary().getBounds().getMaxX() / 2);

        } else {
            isInRightSide = false;
        }

    });

    stage.initStyle(StageStyle.UNDECORATED);

    Scene scene = new Scene(new AnchorPane(hBox), defaultWidth, defaultHeight);

    stage.setScene(scene);
    stage.show();
}

public static void main(String[] args) {
    launch();
}

}

应用启动

到达右侧时应用程序捕捉