JavaFX - 創建主應用程序
創建主應用程序
我們需要建立一個新的布局文件 PersonOverview.fxml
來做為主布局文件,它將包含一個菜單欄和你即將要顯示的布局。
-
在view包裡麵創建一個新的 FXML Document 叫做
RootLayout.fxml
, 這一次,選擇 BorderPane 做為它的根節點 -
在Scene Builder中打開
RootLayout.fxml
。 -
通過設置 Pref Width 為600和 Pref Height 為400來改變這個 BorderPane的尺寸。
-
在最頂上添加一個 MenuBar,先不去給這個菜單添加任何的功能。
The JavaFX Main Class
現在,我們需要創建一個 main java class 用來加載 RootLayout.fxml
,同時添加 PersonOverview.fxml
到RootLayout.fxml中去,這個main class將做為我們這個應用程序的入口。
-
在工程上右鍵選擇 New | Other...,然後選擇 JavaFX Main Class。
-
將這個class命名為
MainApp
,將它放置到controller包中,也就是上麵建的ch.makery.address
(注意: 這個包下有兩個子包,分彆是view
和model
)。
你可能注意到了IDE生成的 MainApp.java
繼承自 Application
同時包含了兩個方法, 這是一個JavaFX應用程序的最基本的代碼結構,這裡最重要的方法是 start(Stage primaryStage)
,它將會在應用程序運行時通過內部的 main
方法自動調用。
正如你所看到的,這個start(...)
方法會接收一個 Stage
類型的參數,下麵的圖向你展示了一個JavaFX應用程序的基本結構。
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
文件名是否拚寫錯誤