Javafx максимизирует / минимизирует руины моего макета
Я работаю над игрой javafx, и макет такой, какой я хочу. Однако макет применяется только после изменения размера окна из-за привязок к ширине и высоте. Когда приложение запускается или когда оно свернуто или развернуто, макет испортится.
После того, как макет испорчен, просто изменив его размер, вы вернете его в нормальное состояние.
Я пытался слушать события максимизации и минимизации и использовать те же методы обновления, которые я использовал при изменении размера, но это не сработало.
primaryStage.maximizedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
gamePane.updatePlayerPanes();
}
});
Я действительно потерян. Я перепробовал много вещей, но не работал макет продолжает портиться при сворачивании или разворачивании.
Только началось: https://prnt.sc/jf2akp
После небольшого изменения размера: http://prntscr.com/jf2b19
В основном я использую GridPane и StackPane для средней панели.
Любые идеи ценятся спасибо.
Редактировать:
Это простой класс, который имитирует проблему
Только что начал: http://prntscr.com/jfb4lm
После небольшого изменения размера: http://prntscr.com/jfb4ud
package test;
import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Test extends Application
{
@Override
public void start(Stage primaryStage)
{
BorderPane bp = new BorderPane();
GridPane gp = new GridPane();
gp.prefHeight(500);
gp.prefWidth(500);
for (int i = 0; i < 5; i++) {
gp.getColumnConstraints().add(new ColumnConstraints(50, 50, Double.MAX_VALUE, Priority.ALWAYS, HPos.CENTER, true));
}
for (int i = 0; i < 5; i++) {
gp.getRowConstraints().add(new RowConstraints(50, 50, Double.MAX_VALUE, Priority.ALWAYS, VPos.CENTER, true));
}
bp.setCenter(gp);
//Simulate the center pane
StackPane centerPane = new StackPane();
centerPane.setStyle("-fx-background-color: Green");
//Add a bunch of cards
for(int i =0; i < 10; i++)
{
Image img = new Image("file:AS_.png");
ImageView imgView = new ImageView(img);
imgView.setPreserveRatio(true);
imgView.fitHeightProperty().bind(centerPane.heightProperty().divide(2));
imgView.setRotate(Math.random()*180);
centerPane.getChildren().add(imgView);
}
gp.add(centerPane, 1, 1, 3, 3);
Scene scene = new Scene(bp, 300, 300);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args)
{
launch(args);
}
}
Есть ли способ заставить изменить размер или что-то?
1 ответ
Добавив эти две строки после primaryStage.show();
кажется, проблема решена. надеюсь, это поможет в вашем реальном приложении
GridPane.setFillHeight(centerPane, true);
GridPane.setFillWidth(centerPane, true);
ваш тестовый класс:
package test;
import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Test extends Application {
@Override
public void start(Stage primaryStage) {
BorderPane bp = new BorderPane();
GridPane gp = new GridPane();
gp.prefHeight(500);
gp.prefWidth(500);
for (int i = 0; i < 5; i++) {
gp.getColumnConstraints()
.add(new ColumnConstraints(50, 50, Double.MAX_VALUE, Priority.ALWAYS, HPos.CENTER, true));
}
for (int i = 0; i < 5; i++) {
gp.getRowConstraints()
.add(new RowConstraints(50, 50, Double.MAX_VALUE, Priority.ALWAYS, VPos.CENTER, true));
}
bp.setCenter(gp);
// Simulate the center pane
StackPane centerPane = new StackPane();
centerPane.setStyle("-fx-background-color: Green");
// Add a bunch of cards
for (int i = 0; i < 10; i++) {
Image img = new Image("file:AS_.png");
ImageView imgView = new ImageView(img);
imgView.setPreserveRatio(true);
imgView.fitHeightProperty().bind(centerPane.heightProperty().divide(2));
imgView.setRotate(Math.random() * 180);
centerPane.getChildren().add(imgView);
}
gp.add(centerPane, 1, 1, 3, 3);
Scene scene = new Scene(bp, 300, 300);
primaryStage.setScene(scene);
primaryStage.show();
GridPane.setFillHeight(centerPane, true);
GridPane.setFillWidth(centerPane, true);
}
public static void main(String[] args) {
launch(args);
}
}