我正在尝试做的是... 1
我正在尝试为我的 Undecorated-window 添加功能,使其在最大化和任务栏的位置发生变化时自动调整大小。
通过使用 onMouseMove 通过 getVisualBounds() 检测屏幕尺寸变化并检查它,我已经接近了。 onMouseMove() 的一个问题是它仅在鼠标移过窗口时调整大小,而不是在更改任务栏后调整大小。
这是我想出的演示代码。
/////// controller Class////////
private Stage stage;
boolean lock = false;
ObservableList<Screen> screenSizes;
public void setUp(Stage stage){
this.stage = stage;
screenSizes = Screen.getScreensForRectangle(new Rectangle2D(this.stage.getX(), this.stage.getY(), this.stage.getWidth(), this.stage.getHeight()));
}
@FXML
protected void onMaximizedButton() {
if(lock == true){
stage.setMaximized(false);
lock = false;
}else{
stage.setMaximized(true);
lock = true;
stage.setX(screenSizes.get(0).getVisualBounds().getMinX());
stage.setY(screenSizes.get(0).getVisualBounds().getMinY());
stage.setWidth(screenSizes.get(0).getVisualBounds().getWidth());
stage.setHeight(screenSizes.get(0).getVisualBounds().getHeight());
}
}
@FXML
private void onMouseMove(){
ObservableList<Screen> newScreenSizes = Screen.getScreensForRectangle(new Rectangle2D(stage.getX(), stage.getY(), stage.getWidth(),stage.getHeight()));
if(!(newScreenSizes.get(0).getVisualBounds().equals(screenSizes.get(0).getVisualBounds()))){
if(lock == true){
//stage.setMaximized(true);
screenSizes = newScreenSizes;
stage.setX(screenSizes.get(0).getVisualBounds().getMinX());
stage.setY(screenSizes.get(0).getVisualBounds().getMinY());
stage.setWidth(screenSizes.get(0).getVisualBounds().getWidth());
stage.setHeight(screenSizes.get(0).getVisualBounds().getHeight());
}
}
}
///// main class////////
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Parent root = fxmlLoader.load();
HelloController helloController = fxmlLoader.getController();
Scene scene = new Scene(root, 320, 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.initStyle(StageStyle.UNDECORATED);
stage.show();
helloController.setUp(stage);
}
public static void main(String[] args) {
launch();
}
我在问是否有办法获取任务栏的位置并在更改时更新它?
我想过但没有做的其他事情,也许使用 Observable 屏幕列表并向其添加一个监听器并以某种方式将其绑定(bind)到某些东西以使其在任务栏更改时自动更改?
最佳答案
这可能不是一个正确的解决方案,但如果您准备好冒险使用 com.sun.* 类,您可以采用以下方法。
import com.sun.glass.ui.Screen;
@Override
public void start(final Stage stage) throws Exception {
// Your code....
Screen.setEventHandler(new Screen.EventHandler() {
@Override
public void handleSettingsChanged() {
System.out.println("Resize the window here......");
}
});
}
关于JAVAFX,当任务栏的位置发生变化时,如何在屏幕上更新最大化未修饰窗口的宽度和高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73547171/