位置:首頁 > Java技術 > JavaFX教學 > JavaFX - 創建主應用程序

JavaFX - 創建主應用程序

創建主應用程序

我們需要建立一個新的布局文件 PersonOverview.fxml 來做為主布局文件,它將包含一個菜單欄和你即將要顯示的布局。

  1. 在view包裡麵創建一個新的 FXML Document 叫做 RootLayout.fxml, 這一次,選擇 BorderPane 做為它的根節點 New RootLayout

  2. 在Scene Builder中打開 RootLayout.fxml

  3. 通過設置 Pref Width 為600和 Pref Height 為400來改變這個 BorderPane的尺寸。 RootLayout Size

  4. 在最頂上添加一個 MenuBar,先不去給這個菜單添加任何的功能。 MenuBar

The JavaFX Main Class

現在,我們需要創建一個 main java class 用來加載 RootLayout.fxml ,同時添加 PersonOverview.fxmlRootLayout.fxml中去,這個main class將做為我們這個應用程序的入口。

  1. 在工程上右鍵選擇 New | Other...,然後選擇 JavaFX Main Class。 New JavaFX Main Class

  2. 將這個class命名為 MainApp,將它放置到controller包中,也就是上麵建的 ch.makery.address (注意: 這個包下有兩個子包,分彆是view 和 model)。
    New JavaFX Main Class

你可能注意到了IDE生成的 MainApp.java 繼承自 Application 同時包含了兩個方法, 這是一個JavaFX應用程序的最基本的代碼結構,這裡最重要的方法是 start(Stage primaryStage) ,它將會在應用程序運行時通過內部的 main 方法自動調用。

正如你所看到的,這個start(...) 方法會接收一個 Stage 類型的參數,下麵的圖向你展示了一個JavaFX應用程序的基本結構。

New FXML Document
Image Source: http://www.oracle.com

一切看起來象是劇場裡表演: 這裡的 Stage 是一個主容器,它就是我們通常所認為的窗口(有邊,高和寬,還有關閉按鈕)。在這個 Stage 裡麵,你可以放置一個 Scene,當然你可以切換彆的 Scene,而在這個 Scene 裡麵,我們就可以放置各種各樣的控件。

更詳細的信息,你可以參考 Working with the JavaFX Scene Graph.


打開 MainApp.java,將已有的代碼替換成下麵的代碼:

package ch.makery.address;

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class MainApp extends Application {

    private Stage primaryStage;
    private BorderPane rootLayout;

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("AddressApp");

        initRootLayout();

        showPersonOverview();
    }

    /**
     * Initializes the root layout.
     */
    public void initRootLayout() {
        try {
            // Load root layout from fxml file.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml"));
            rootLayout = (BorderPane) loader.load();

            // Show the scene containing the root layout.
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Shows the person overview inside the root layout.
     */
    public void showPersonOverview() {
        try {
            // Load person overview.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainApp.class.getResource("view/PersonOverview.fxml"));
            AnchorPane personOverview = (AnchorPane) loader.load();

            // Set person overview into the center of root layout.
            rootLayout.setCenter(personOverview);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Returns the main stage.
     * @return
     */
    public Stage getPrimaryStage() {
        return primaryStage;
    }

    public static void main(String[] args) {
        launch(args);
    }
}

代碼中的注釋會給你一些小提示,注明代碼的含義。

如果你現在就運行這個程序,那麼你將會看到和這篇文章開頭所展示的圖片那樣的界麵。

你有可能遇見的問題

如果你的應用程序找不到你所指定的 fxml 布局文件,那麼係統會提示以下的錯誤:

java.lang.IllegalStateException: Location is not set.

你可以檢查一下你的 fxml 文件名是否拚寫錯誤

如果還是不能工作,請下載這篇教學所對應的源代碼,然後將源代碼中的fxml文件替換掉你的