JavaFX的窗体文件是fxml格式的xml文件。JavaFX通过FXMLLoader加载fxml文件,并将其进行显示。
fxml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015, 2019, Gluon and/or its affiliates.
All rights reserved. Use is subject to license terms.
This file is available and licensed under the following license:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
- Neither the name of Oracle Corporation nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.control.SeparatorMenuItem?>
<?import javafx.scene.control.Spinner?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.web.WebView?>
<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="form.MainFrameController">
<children>
<MenuBar VBox.vgrow="NEVER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="New" />
<MenuItem fx:id="openFileItem" mnemonicParsing="false" text="Open…" />
<Menu mnemonicParsing="false" text="Open Recent" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Close" />
<MenuItem mnemonicParsing="false" text="Save" />
<MenuItem mnemonicParsing="false" text="Save As…" />
<MenuItem mnemonicParsing="false" text="Revert" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Preferences…" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem fx:id="quitItem" mnemonicParsing="false" text="Quit" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Undo" />
<MenuItem mnemonicParsing="false" text="Redo" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Cut" />
<MenuItem mnemonicParsing="false" text="Copy" />
<MenuItem mnemonicParsing="false" text="Paste" />
<MenuItem mnemonicParsing="false" text="Delete" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Select All" />
<MenuItem mnemonicParsing="false" text="Unselect All" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About MyHelloApp" />
</items>
</Menu>
</menus>
</MenuBar>
<TabPane prefHeight="375.0" prefWidth="642.0" tabClosingPolicy="UNAVAILABLE" VBox.vgrow="ALWAYS">
<tabs>
<Tab fx:id="trackDataViewTab" text="雷达数据" />
<Tab fx:id="trackDataMapTab" text="雷达数据地图">
<content>
<BorderPane prefHeight="200.0" prefWidth="200.0">
<center>
<WebView fx:id="trackMapWebView" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
</center>
<left>
<VBox prefHeight="200.0" prefWidth="150.0" spacing="2.0" BorderPane.alignment="CENTER">
<children>
<Label text="最底高度范围:0~15000米" />
<Spinner fx:id="minAltitudeSpinner" editable="true" />
<Label text="最高高度范围:0~15000米" />
<Spinner fx:id="maxAltitudeSpinner" editable="true" />
<Button mnemonicParsing="false" prefHeight="23.0" prefWidth="150.0" text="高 度 过 滤">
<font>
<Font size="16.0" />
</font>
</Button>
<Separator orientation="VERTICAL" prefHeight="200.0" />
</children>
</VBox>
</left>
</BorderPane>
</content>
</Tab>
</tabs>
</TabPane>
</children>
</VBox>
绑定的的Java文件:
package form;
import java.net.URL;
import java.util.ResourceBundle;
import handle.MainFrameHandle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Spinner;
import javafx.scene.control.Tab;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
/**
* @copyright 2003-2023
* @package form
* @file MainFrameController.java
* @date 2023-12-16
* @author qiao wei
* @version 1.0
* @brief MainWindow.fxml文件对应的Java类。
* @history
*/
public class MainFrameController implements Initializable {
public MainFrameController() {
mainFrameHandle = MainFrameHandle.getInstance();
}
/**
* @class MainFrameController
* @date 2023-12-18
* @author qiao wei
* @version 1.0
* @brief 初始化,实现Initializable接口。MainFrameController.java与MainWindow.fxml绑定,当fxml文件被FXMLLoader
* 加载(加载fxml文件时,绑定的控件已经进行初始化)后就自动调用该方法,对已经创建的控件可以进行二次设置。
* @param
* @return
* @throws
*/
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
setControlProperty();
}
private void setControlProperty() {
openFileItem.setOnAction(event -> mainFrameHandle.chooseFiles());
quitItem.setOnAction(event -> mainFrameHandle.exitApplication(event));
WebEngine webEngine = trackMapWebView.getEngine();
webEngine.load("https://toutiao.com/");
// StackPane stackPane = new StackPane();
// stackPane.getChildren().addAll(webView);
//
// HBox hBox = new HBox();
// HBox.setHgrow(webView, Priority.ALWAYS);
// VBox.setVgrow(webView, Priority.ALWAYS);
// hBox.getChildren().addAll(webView);
// trackDataMapTab.setContent(hBox);
}
@FXML
private Tab trackDataViewTab;
@FXML
private Tab trackDataMapTab;
@FXML
private MenuItem openFileItem;
@FXML
private MenuItem quitItem;
@FXML
private Spinner<Integer> minAltitudeSpinner;
@FXML
private Spinner<Integer> maxAltitudeSpinner;
@FXML
private WebView trackMapWebView;
private MainFrameHandle mainFrameHandle;
}
Initializable接口简介:
Controller initialization interface.
NOTE?This interface has been superseded by automatic injection?of?
location
?and?resources
?properties into the controller.?FXMLLoader
?will now automatically call any suitably annotated no-arg?initialize()
?method defined by the controller. It is recommended that the injection approach be used whenever possible.Since:
fxml文件中的JavaFX控件在Java文件中绑定,在Java类的构造函数中还没有初始化,所有的控件还都是null,但是Java类继承了Initializable接口,则在构造函数之后自动调用Initializable接口的方法,此时JavaFX控件已经初始化,可以进行设置了。