Javafx максимизирует / минимизирует руины моего макета - PullRequest
0 голосов
/ 08 мая 2018

Я работаю над игрой 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 для средней панели.

Любые идеи приветствуются.

Edit:

Это простой класс, имитирующий задачу

Только началось: 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 Ответ

0 голосов
/ 08 мая 2018

добавив эти две строки после 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...