JavaFX:第一次尝试时显示空 window
JavaFX: Empty window is displayed on first attempt
前言:Javafxml 新手
我的应用程序运行良好。我只有一个问题,我知道应该有一个非常简单的解决方案,但我想不出更多。
当我 运行 我的应用程序时,我得到一个空的 window。
Empty Window
我必须调整 window 的大小才能获得所需的
@FXML
void invoice(ActionEvent event) throws IOException {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/view/Invoice2.fxml"));
Parent planner;
try {
planner = (Parent) loader.load();
stage.setTitle("Order Details");
stage.getScene().setRoot(planner);
} catch (IOException e) {
e.printStackTrace();
}
}
FXML 代码:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<TitledPane collapsible="false" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="800.0" prefWidth="1200.0" text="Invoice" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.InvoiceController">
<content>
<AnchorPane prefHeight="200.0" prefWidth="200.0">
<children>
<SplitPane dividerPositions="0.08355795148247978" layoutX="166.0" layoutY="108.0" orientation="VERTICAL" prefHeight="374.0" prefWidth="598.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0" styleClass="body-default" stylesheets="@main.css" SplitPane.resizableWithParent="false">
<children>
<Button fx:id="back" layoutX="20.0" layoutY="14.0" mnemonicParsing="false" onAction="#BackButton" prefHeight="37.0" prefWidth="79.0" styleClass="btn-default" stylesheets="@main.css" text="Back" AnchorPane.leftAnchor="20.0" AnchorPane.topAnchor="14.0" />
</children>
</AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
<children>
<SplitPane dividerPositions="0.7078260869565217" layoutX="158.0" layoutY="29.0" prefHeight="283.0" prefWidth="577.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
<children>
<TableView fx:id="invoicelisttb1" layoutX="71.0" layoutY="14.0" prefHeight="281.0" prefWidth="404.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns>
<TableColumn fx:id="order" prefWidth="148.0" text="Order No." />
<TableColumn fx:id="name" prefWidth="167.0" text="Name" />
<TableColumn fx:id="price" prefWidth="173.0" text="Price" />
</columns>
</TableView>
</children>
</AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" SplitPane.resizableWithParent="false">
<children>
<Label layoutX="14.0" layoutY="44.0" prefHeight="31.0" prefWidth="91.0" styleClass="bold" stylesheets="@main.css" text="Order No:" AnchorPane.rightAnchor="233.0" />
<TextField fx:id="txtorder" editable="false" layoutX="197.0" layoutY="44.0" prefHeight="25.0" prefWidth="83.0" AnchorPane.rightAnchor="58.0" />
<Label layoutX="14.0" layoutY="91.0" prefHeight="31.0" prefWidth="77.0" styleClass="bold" stylesheets="@main.css" text="Price:" AnchorPane.rightAnchor="246.0" />
<TextField fx:id="txtprice" layoutX="197.0" layoutY="91.0" prefHeight="25.0" prefWidth="83.0" AnchorPane.rightAnchor="58.0" />
<Button fx:id="btnprice" layoutX="196.0" layoutY="160.0" mnemonicParsing="false" onAction="#enterPrice" prefHeight="31.0" prefWidth="113.0" styleClass="btn-default" stylesheets="@main.css" text="Enter Price" AnchorPane.rightAnchor="58.0" />
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</AnchorPane>
</content>
</TitledPane>
尝试以下操作:
try {
Parent planner = FXMLLoader.load(getClass().getResource("/view/Invoice2.fxml"));
stage.setTitle("Order Details");
stage.setScene(new Scene(planner));
} catch (IOException e) {
e.printStackTrace();
}
我使用了 stage.setScene(new Scene(planner));
而不是 stage.getScene().setRoot(planner)
。
将资源改为 "../view/Invoice2.fxml"
,而不是 loader.setLocation(getClass().getResource("/view/Invoice2.fxml"));
。如果您的项目目录结构是这样的,这将起作用:
project
|
\_ view
| |
| \_ Invoice2.fxml
\_ main
\_ Main.java
"../path"
表示选择的路径在同一个父目录下,不在我们当前目录下
经过几天的努力,我终于通过简单地将整个 fxml 的结构放在另一个 Anchor Pane 中解决了这个问题。我不知道为什么会解决它或如何解决它,但是当我将整个 GUI 包装在 Anchor Pane 中时,它开始正常工作。
前言:Javafxml 新手 我的应用程序运行良好。我只有一个问题,我知道应该有一个非常简单的解决方案,但我想不出更多。
当我 运行 我的应用程序时,我得到一个空的 window。 Empty Window
我必须调整 window 的大小才能获得所需的
@FXML
void invoice(ActionEvent event) throws IOException {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/view/Invoice2.fxml"));
Parent planner;
try {
planner = (Parent) loader.load();
stage.setTitle("Order Details");
stage.getScene().setRoot(planner);
} catch (IOException e) {
e.printStackTrace();
}
}
FXML 代码:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<TitledPane collapsible="false" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="800.0" prefWidth="1200.0" text="Invoice" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.InvoiceController">
<content>
<AnchorPane prefHeight="200.0" prefWidth="200.0">
<children>
<SplitPane dividerPositions="0.08355795148247978" layoutX="166.0" layoutY="108.0" orientation="VERTICAL" prefHeight="374.0" prefWidth="598.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0" styleClass="body-default" stylesheets="@main.css" SplitPane.resizableWithParent="false">
<children>
<Button fx:id="back" layoutX="20.0" layoutY="14.0" mnemonicParsing="false" onAction="#BackButton" prefHeight="37.0" prefWidth="79.0" styleClass="btn-default" stylesheets="@main.css" text="Back" AnchorPane.leftAnchor="20.0" AnchorPane.topAnchor="14.0" />
</children>
</AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
<children>
<SplitPane dividerPositions="0.7078260869565217" layoutX="158.0" layoutY="29.0" prefHeight="283.0" prefWidth="577.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
<children>
<TableView fx:id="invoicelisttb1" layoutX="71.0" layoutY="14.0" prefHeight="281.0" prefWidth="404.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns>
<TableColumn fx:id="order" prefWidth="148.0" text="Order No." />
<TableColumn fx:id="name" prefWidth="167.0" text="Name" />
<TableColumn fx:id="price" prefWidth="173.0" text="Price" />
</columns>
</TableView>
</children>
</AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" SplitPane.resizableWithParent="false">
<children>
<Label layoutX="14.0" layoutY="44.0" prefHeight="31.0" prefWidth="91.0" styleClass="bold" stylesheets="@main.css" text="Order No:" AnchorPane.rightAnchor="233.0" />
<TextField fx:id="txtorder" editable="false" layoutX="197.0" layoutY="44.0" prefHeight="25.0" prefWidth="83.0" AnchorPane.rightAnchor="58.0" />
<Label layoutX="14.0" layoutY="91.0" prefHeight="31.0" prefWidth="77.0" styleClass="bold" stylesheets="@main.css" text="Price:" AnchorPane.rightAnchor="246.0" />
<TextField fx:id="txtprice" layoutX="197.0" layoutY="91.0" prefHeight="25.0" prefWidth="83.0" AnchorPane.rightAnchor="58.0" />
<Button fx:id="btnprice" layoutX="196.0" layoutY="160.0" mnemonicParsing="false" onAction="#enterPrice" prefHeight="31.0" prefWidth="113.0" styleClass="btn-default" stylesheets="@main.css" text="Enter Price" AnchorPane.rightAnchor="58.0" />
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</AnchorPane>
</content>
</TitledPane>
尝试以下操作:
try {
Parent planner = FXMLLoader.load(getClass().getResource("/view/Invoice2.fxml"));
stage.setTitle("Order Details");
stage.setScene(new Scene(planner));
} catch (IOException e) {
e.printStackTrace();
}
我使用了 stage.setScene(new Scene(planner));
而不是 stage.getScene().setRoot(planner)
。
将资源改为 "../view/Invoice2.fxml"
,而不是 loader.setLocation(getClass().getResource("/view/Invoice2.fxml"));
。如果您的项目目录结构是这样的,这将起作用:
project
|
\_ view
| |
| \_ Invoice2.fxml
\_ main
\_ Main.java
"../path"
表示选择的路径在同一个父目录下,不在我们当前目录下
经过几天的努力,我终于通过简单地将整个 fxml 的结构放在另一个 Anchor Pane 中解决了这个问题。我不知道为什么会解决它或如何解决它,但是当我将整个 GUI 包装在 Anchor Pane 中时,它开始正常工作。