#java #javafx
#java #javafx
Вопрос:
У меня есть приложение на JavaFX, я хотел бы знать, как можно отключить параметр изменения размера, но не отключать кнопку развернуть, потому что, если мне нужно развернуть окно.
Я использую следующий фрагмент:
stage.setResizable (false);
Ответ №1:
Это решение не очень красивое или «чистый код», но, по крайней мере, оно работает:
Вы можете добиться этого, установив для stage минимальный и максимальный размер с одинаковым значением. Это приведет к тому, что размер окна не будет изменен, если пользователь попытается изменить его размер. Но поскольку для resizable
свойства по-прежнему установлено значение true
, кнопка максимизации по-прежнему включена. К сожалению, развернутое окно также будет иметь максимальный размер, который вы ввели, поэтому оно не будет действительно развернуто. Чтобы исправить это, вам нужно удалить максимальный размер со сцены, как только окно будет развернуто (что является уродливой частью этого решения).
Вы можете сделать это следующим образом:
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class MaximizableButNotResizableExample extends Application {
public static final int WIDTH = 600;
public static final int HEIGHT = 400;
//flag that indicates the window is re-maximized by the application (to prevent setting the maximum size when un-maximizing the stage)
private boolean reMaximize = false;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
try {
Parent root = new AnchorPane();
Scene scene = new Scene(root, WIDTH, HEIGHT);
primaryStage.setScene(scene);
primaryStage.show();
//set the stages maximum and minimum size so it can't be resized
primaryStage.setMinWidth(WIDTH);
primaryStage.setMaxWidth(WIDTH);
primaryStage.setMinHeight(HEIGHT);
primaryStage.setMaxHeight(HEIGHT);
//add a listener to the maximized property to disable the maximum size of the window when it gets maximized
primaryStage.maximizedProperty().addListener((observer, oldVal, newVal) -> {
if (newVal) {
//remove the maximum size when maximizing the stage
primaryStage.setMaxWidth(Integer.MAX_VALUE);
primaryStage.setMaxHeight(Integer.MAX_VALUE);
if (!reMaximize) {
//re-maximize the stage programmatically to make it realize there is no maximum size anymore
reMaximize = true;
primaryStage.setMaximized(false);
primaryStage.setMaximized(true);
}
reMaximize = false;
}
else {
//set the maximum size only if the un-maximize was caused by the user
if (!reMaximize) {
primaryStage.setMaxWidth(WIDTH);
primaryStage.setMaxHeight(HEIGHT);
}
}
});
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Я действительно надеюсь, что у javafx есть лучшее решение для этого, которое я просто не нашел, но если нет, этот обходной путь также должен сработать.