GOOGLE ADS

Sonntag, 1. Mai 2022

Das benutzerdefinierte Ziehverhalten der Titelleiste unterstützt kein Fensterausrichten

Während dieser Stackoverflow-Beitrag hilft, das Drag-Problem zu lösen,
wie man ein nicht verziertes Fenster (Bühne) von JavaFX zieht

Es lässt Windows Snap definitiv nicht funktionieren. Gibt es eine Möglichkeit, wie ich dies verwenden soll, um Window Snap zum Laufen zu bringen?


Lösung des Problems

Dies ist eine JavaFX-App mit einer Klasse, die Sie ausprobieren können. Sie können die Bühne mit dem grünen Kreis ziehen und die App mit dem roten schließen. wann stage.getX==0ist auf der linken Seite des Bildschirms und die App ändert die Größe auf maxHeightdes Bildschirms, der sich darin befindet Screen.getPrimary().getBounds().getMaxY()und Screen.getPrimary().getBounds().getMaxX()durch zwei geteilt wird, um die halbe Breite des Bildschirms zu erhalten. denn die rechte Seite ist ein bisschen knifflig, wenn stage.getX()plus die aktuelle Breite des Fensters übereinstimmt Screen.getPrimary().getBounds().getMaxY()bedeutet, dass die rechte Seite des Fensters die rechte Seite des Bildschirms erreicht. Alle anderen Werte der x-Position der Bühne werden auf die Originalgröße zurückgesetzt. und... für den oberen Teil. Wannstage.getY()<=0 und nicht ganz links und ganz rechts auf dem Bildschirm die App im Vollbildmodus aufrufen. Jedes Mal, wenn der grüne Kreis gedrückt wird, prüft der Zuhörer, ob er im Vollbildmodus ist oder nicht. Wenn es im Vollbildmodus ist, wird es auf die Standardgröße zurückgesetzt.

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
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 -> {
if (stage.isFullScreen()) {
stage.setFullScreen(false);
}
{
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.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;
}
});
// snap to top = fullscreen
stage.yProperty().addListener(e -> {
if (stage.getY() <= 0 && stage.getX()!= 0 &&!isInRightSide) {
stage.setFullScreen(true);
}
});
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();
}
}

App starten
App starten

App-Snap, wenn die rechte Seite erreicht wird

undekorierter javafx snap

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...