gpt4 book ai didi

java - 无法在 AnchorPane 内调整 AnchorPane 的大小

转载 作者:行者123 更新时间:2023-12-02 01:52:31 34 4
gpt4 key购买 nike

我正在编写一个 JavaFX 应用程序,顶部有一个菜单栏,下面有一个 AnchorPane,我可以在其中使用其他 FXML 文件来显示内容。问题是当代码运行时,即使我将 Vgrow 设置为“始终”,其他 FXML 文件的内容也不会调整大小。所有这些都位于 AnchorPane 内。

有人可以告诉我该怎么做才能获得内部 AnchorPane 除标题栏以外的所有空间...

下面是父 AnchorPane ( savingsCreateDeleteAccount.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" />

下面是 Controller 类(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。

最佳答案

问题是您将从 fxml 加载的内容添加到 Pane 中,除了将内容大小调整为首选大小之外,该 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 覆盖,而不会以任何方式影响布局。

关于java - 无法在 AnchorPane 内调整 AnchorPane 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52787028/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com