我正在编写一个javafx应用程序,我想让我的窗口不要超出屏幕界限,因为没有太多用处。因此,例如,窗口不应该被拖动,以便其中一半不在屏幕上。
public class ui extends Application{
public static void main (String[] args){
launch(args);
}
public void start(Stage mainStage){
mainStage.initStyle(StageStyle.DECORATED);
Rectangle2D mainScreen = Screen.getPrimary().getVisualBounds();
mainStage.setWidth(mainScreen.getWidth());
mainStage.setHeight(mainScreen.getHeight());
BorderPane mainPane = new BorderPane(background);
Scene mainScene = new Scene(mainPane, Color.BLACK);
mainStage.setScene(mainScene);
mainStage.show();
}
}
答案 0 :(得分:5)
有很多理由不这样做:您需要注意不要禁用用户可能期望的功能,例如在扩展桌面上拖动(即在多个物理显示之间拖动)或在虚拟桌面之间移动窗口(例如Mac OS X中的“Spaces”或Linux中的等效系统)。
这里你可以做的最好的事情就是用听众观察窗户的位置,如果它超出了所需的界限,就把它推回到最佳位置。作为用户体验,这可能有点令人不满意,但实现了您想要的功能:
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.geometry.BoundingBox;
import javafx.geometry.Bounds;
import javafx.geometry.Rectangle2D;
import javafx.stage.Screen;
import javafx.stage.Stage;
public class ConstrainedWindow extends Application {
@Override
public void start(Stage primaryStage) {
Bounds allScreenBounds = computeAllScreenBounds();
ChangeListener<Number> boundsListener = (obs, oldValue, newValue) -> {
double x = primaryStage.getX();
double y = primaryStage.getY();
double w = primaryStage.getWidth();
double h = primaryStage.getHeight();
if (x < allScreenBounds.getMinX()) {
primaryStage.setX(allScreenBounds.getMinX());
}
if (x + w > allScreenBounds.getMaxX()) {
primaryStage.setX(allScreenBounds.getMaxX() - w);
}
if (y < allScreenBounds.getMinY()) {
primaryStage.setY(allScreenBounds.getMinY());
}
if (y + h > allScreenBounds.getMaxY()) {
primaryStage.setY(allScreenBounds.getMaxY() - h);
}
};
primaryStage.xProperty().addListener(boundsListener);
primaryStage.yProperty().addListener(boundsListener);
primaryStage.widthProperty().addListener(boundsListener);
primaryStage.heightProperty().addListener(boundsListener);
primaryStage.show();
}
private Bounds computeAllScreenBounds() {
double minX = Double.POSITIVE_INFINITY ;
double minY = Double.POSITIVE_INFINITY ;
double maxX = Double.NEGATIVE_INFINITY ;
double maxY = Double.NEGATIVE_INFINITY ;
for (Screen screen : Screen.getScreens()) {
Rectangle2D screenBounds = screen.getBounds();
if (screenBounds.getMinX() < minX) {
minX = screenBounds.getMinX();
}
if (screenBounds.getMinY() < minY) {
minY = screenBounds.getMinY() ;
}
if (screenBounds.getMaxX() > maxX) {
maxX = screenBounds.getMaxX();
}
if (screenBounds.getMaxY() > maxY) {
maxY = screenBounds.getMaxY() ;
}
}
return new BoundingBox(minX, minY, maxX-minX, maxY-minY);
}
public static void main(String[] args) {
launch(args);
}
}
答案 1 :(得分:0)
这里有一些可能有用的想法
public final int width = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width;
public final int height = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height;
这两行代码可以让您获得大多数计算机屏幕尺寸的长度和宽度。
接下来,我将设置一个不断获取窗口位置的方法,或者至少在移动窗口时更改值,然后根据您对屏幕大小和窗口大小的了解设置限制。一种方法就是......
if(yWinPos > (height - wHeight))//wHeight is actual height of the window, not the y pos of window
{
//code that prevents it from moving past the bottom part of screen
}
如果这有任何帮助或者如果它没有回答您的问题,请告诉我,我会在回复时编辑我的答案。