Java Fx изменяет размер сцены на сцену - PullRequest
0 голосов
/ 14 ноября 2018

Я искал, но не смог найти ничего похожего на проблему с Fx. Я использую Java Fx / JDK 8 и у меня проблемы с изменением размера сцен. Приведенный ниже код загружает только один экран за раз в графике сцены и переключается между экранами. Проблема в том, когда я изменяю размер сцены. Размер сцены не изменяется со сценой. Ничего особенного в файлах FXML только якорная панель и несколько компонентов. Заранее спасибо.

public class ScreensFramework extends Application {

    static String main = "main";
    static String mainFile = "Main.fxml";
    static String play = "play";
    static String playFile = "Play.fxml";


      public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage mainStage) {
        ScreensController mainContainer = new ScreensController();
        mainContainer.loadScreen(ScreensFramework.main, ScreensFramework.mainFile);
        mainContainer.loadScreen(ScreensFramework.play, ScreensFramework.playFile);

        mainContainer.setScreen(ScreensFramework.main);

        AnchorPane root = new AnchorPane();
        root.getChildren().setAll(mainContainer);
        Scene scene = new Scene(root);
        mainStage.setScene(scene);
        //This did not work out either
        mainStage.heightProperty().addListener((observable, oldValue, newValue) -> {
        root.getScene().prefHeight((double) newValue);
        });
        mainStage.show();
    }
}

public class MainController implements Initializable, ControlledScreen {

    ScreensController myController;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }

    public void setScreenParent(ScreensController screenParent){
        myController = screenParent;
    }
}

public class PlayController implements Initializable, ControlledScreen {

    ScreensController myController;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }

    public void setScreenParent(ScreensController screenParent){
        myController = screenParent;
    }
}


public class ScreensController extends AnchorPane {

    private HashMap<String, Node> screens = new HashMap<>();

    public void addScreen(String name, Node screen) {
        screens.put(name, screen);
    }

    public boolean loadScreen(String name, String resource) {
        try {
            FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
            Parent loadScreen = (Parent) myLoader.load();
            ControlledScreen myScreenControler = ((ControlledScreen) myLoader.getController());
            myScreenControler.setScreenParent(this);
            addScreen(name, loadScreen);
            return true;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return false;
        }
    }

     public boolean setScreen(final String name) {

        if (screens.get(name) != null) {    
            if (!getChildren().isEmpty()) {    
                getChildren().remove(0);                    //remove the displayed screen
                getChildren().add(0, screens.get(name));     //add the screen

            } else {
                getChildren().add(screens.get(name));  
            }
            return true;
        } else {
            return false;
        }               
    }       
}

1 Ответ

0 голосов
/ 14 ноября 2018

Вы не устанавливаете якоря для mainContainer или для детей.Таким образом, mainContainer просто изменяется до его предпочтительного размера, а дочерние элементы изменяются до их предпочтительных размеров.prefHeight() не назначает предпочтительную высоту, но вычисляет ее.

Присвоение предпочтительных размеров не требуется, хотя, если вы используете свойства привязки:

AnchorPane.setTopAnchor(mainContainer, 0d);
AnchorPane.setRightAnchor(mainContainer, 0d);
AnchorPane.setBottomAnchor(mainContainer, 0d);
AnchorPane.setLeftAnchor(mainContainer, 0d);
public void addScreen(String name, Node screen) {
    screens.put(name, screen);
    AnchorPane.setTopAnchor(screen, 0d);
    AnchorPane.setRightAnchor(screen, 0d);
    AnchorPane.setBottomAnchor(screen, 0d);
    AnchorPane.setLeftAnchor(screen, 0d);
}

Использование StackPane s вместо AnchorPane s (и как корень сцены, и как супертип ScreensController) будет намного проще, поскольку он изменяет размер дочерних элементов без необходимости указывать якоря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...