Нет изменения размера AnchorPane внутри AnchorPane - PullRequest
0 голосов
/ 13 октября 2018

Я пишу приложение JavaFX, где у меня есть строка меню вверху и AnchorPane ниже той, где я могу использовать другой файл FXML для отображения содержимого.Проблема в том, что когда код выполняется, содержимое другого файла FXML не изменяется, даже после того, как я установил для Vgrow значение «Всегда».Все это находится внутри AnchorPane.

Может кто-нибудь подсказать, пожалуйста, что делать, чтобы внутренняя панель AnchorPane имела все пространство, кроме области заголовка ...

Ниже приведен код родительского AnchorPane (SavingCreateDeleteAccount.fxml):

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>

<AnchorPane prefHeight="455.0" prefWidth="753.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="HomePage">
   <children>
      <VBox layoutX="-122.0" layoutY="41.0" prefHeight="200.0" prefWidth="722.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <MenuBar>
              <menus>
                <Menu mnemonicParsing="false" text="Home">
                  <items>
                        <MenuItem mnemonicParsing="false" onAction="#homeScreenOnAction" text="HomeScreen" />
                    <MenuItem mnemonicParsing="false" onAction="#closeOnAction" text="Close" />
                  </items>
                </Menu>
                <Menu mnemonicParsing="false" text="Account">
                     <items>
                        <Menu mnemonicParsing="false" text="Savings Account">
                          <items>
                            <MenuItem mnemonicParsing="false" onAction="#savingsCreateDeleteAccountOnAction" text="Create/Delete Account" />
                              <MenuItem mnemonicParsing="false" onAction="#savingsViewAccountsOnAction" text="View Account(s)" />
                          </items>
                        </Menu>
                        <Menu mnemonicParsing="false" text="Current Account">
                          <items>
                            <MenuItem mnemonicParsing="false" onAction="#currentCreateDeleteAccountOnAction" text="Create/Delete Account" />
                              <MenuItem mnemonicParsing="false" onAction="#currentViewAccountsOnAction" text="View Account(s)" />
                          </items>
                        </Menu>
                     </items>
                </Menu>
                <Menu mnemonicParsing="false" text="Transactions">
                  <items>
                    <MenuItem mnemonicParsing="false" text="Personal Transactions" />
                        <MenuItem mnemonicParsing="false" text="Business Transactions" />
                  </items>
                </Menu>
                  <Menu mnemonicParsing="false" text="Loan">
                    <items>
                      <MenuItem mnemonicParsing="false" text="Student Loan" />
                        <MenuItem mnemonicParsing="false" text="Property Loan" />
                        <MenuItem mnemonicParsing="false" text="Business Loan" />
                    </items>
                  </Menu>
                  <Menu mnemonicParsing="false" text="Help">
                    <items>
                      <MenuItem mnemonicParsing="false" text="About Bank" />
                        <MenuItem mnemonicParsing="false" text="About App" />
                    </items>
                  </Menu>
              </menus>
            </MenuBar>
            <Pane fx:id="displayPane" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" VBox.vgrow="ALWAYS" />
         </children>
      </VBox>
   </children>
</AnchorPane>

Ниже приведен код дочернего AnchorPane (homePage.fxml):

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.Pane?>


<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: red;" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" />

Нижекод класса контроллера (HomePage.java):

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;

public class HomePage {

    @FXML Pane displayPane;

    @FXML public void homeScreenOnAction() throws Exception {
        Pane newPane = FXMLLoader.load(getClass().getResource("homePage.fxml"));
        Main.primaryStage.setScene(new Scene(newPane, 1000, 600));
        Main.primaryStage.show();
    }

    @FXML public void closeOnAction() {
        Main.primaryStage.close();
    }

    @FXML public void savingsCreateDeleteAccountOnAction() throws Exception {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("savingsCreateDeleteAccount.fxml"));
        Pane tempPane = fxmlLoader.load();
        displayPane.getChildren().setAll(tempPane);
    }

    @FXML public void savingsViewAccountsOnAction() {

    }

    @FXML public void currentCreateDeleteAccountOnAction() {

    }

    @FXML public void currentViewAccountsOnAction() {

    }

//    Transactions, Loan and Help
}

Метод, на котором необходимо сосредоточиться: SavingCreateDeleteAccountOnAction () Main.primaryStage: статическая переменная в классе Main для хранения primaryStage программы.

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Я бы избегал AnchorPanes для изменения размеров.Обычно они работают лучше, если у вас есть статический размер для области, которую вы хотите сохранить, независимо от размера окна.Гораздо проще заменить AnchorPanes на BorderPanes или FlowPanes.Обычно это решает многие проблемы с изменением размера.

0 голосов
/ 13 октября 2018

Проблема в том, что вы добавляете контент, загруженный из fxml, в Pane, который не выполняет никакого позиционирования или изменения размера, кроме изменения размера контента до его предпочтительного размера.

Замена displayPane в дочернем списке родительского макета позволит VBox изменить размер / положение.


В этом случае гораздо проще использовать другой макет: BorderPane

Этот макет позволяет легко заменить узел, например displayPane, а также изменить размер узла, который занимает его место автоматически:

<BorderPane fx:id="container" prefHeight="455.0" prefWidth="753.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="HomePage">
    <top>
        <MenuBar>
        ...
        </MenuBar>
    </top>
    <center>
        <Pane fx:id="displayPane" prefHeight="200.0" prefWidth="200.0" />
    </center>
</BorderPane>
@FXML
private BorderPane container;

@FXML private void savingsCreateDeleteAccountOnAction() throws Exception {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("savingsCreateDeleteAccount.fxml"));
    Pane tempPane = fxmlLoader.load();
    container.setCenter(tempPane);
}

Примечание: Использование статических свойств макетов, которые не являются родительскими для узла, бессмысленно.Например, родительский элемент displayPane является VBox, поэтому

AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"

не оказывает никакого влияния.

Также вручную устанавливается layoutX / layoutY, если родительский макет делаетпозиционирование бессмысленно.Эти свойства вашего VBox просто перезаписываются родительским AnchorPane во время первого прохода макета, никак не влияя на макет.

...