Initializable接口,JavaFX加载fxml文件的控件,

2023-12-19 22:42:17

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控件已经初始化,可以进行设置了。

文章来源:https://blog.csdn.net/weiweiqiao/article/details/135061115
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。