學習JavaFX(一):初步認識GUI設計


JavaFX v.s. Java
JavaFX:聲明式、靜態類型的腳本語言;它具有一等函數、聲明的語法、列表推導,以及基於依賴關系的增量式求值等特征;JavaFX 腳本式語言特別適用於Java2D swing GUI組件,它允許簡單地創建圖形界面;在JavaFX中可以直接調用Java的算術、邏輯運算符,instance等操作符,還可以顯式調用Java類庫和方法;使用JavaFX可以輕松的編寫跨平台的富客戶端應用程序

Java:老派的編程語言,不解釋;同樣的在Java中可以使用ScriptEngineManager這個類顯式調用JavaFX;總之,JavaFX、Java二者的混合使用非常爽

JavaFX的基本程序結構
javafx.application.Application類
javafx.application.Application類定義了編程JavaFX的基本要素

每個JavaFX程序都定義在一個extends了javafx.application.Application類的類中

javafx.application.Application是JavaFX程序的入口類,自定義類繼承該類,並覆蓋該類的start()方法,它是JavaFX的入口方法

javafx.stage.Stage類、javafx.scene.Scene類、基本布局(layout)
好吧……我承認這一塊寫得有點亂(思路清晰就行 :-)

javafx.stage.Stage類繼承自javafx.stage.Window類,是JavaFX的頂層容器,代表一個舞台,當JavaFX程序被啟動時,一個Stage就被自動創建,並通過參數傳遞給start()方法

@Override
public void start(Stage primaryStage){
// code goes here...
}


以下文字翻譯自JavaFX官方文檔:

風格(Style):一個stage有且僅有以下一種風格,1)StageStyle.DECORATED:有裝飾的實心白色,2)StageStyle.UNDECORATED:無裝飾的實心白色,3)StageStyle.TRANSPARENT:無裝飾的透明舞台,4)StageStyle.UTILITY:有着朴素裝飾的實心白色

所有者(Owner):一個stage可以選擇性的選擇一個window作為其所有者,通過initOwner(..)方法指定所屬窗口對象

表現方式(Modality):一個stage可以有以下的表現方式:1)Modality.NONE:不遮擋別的stage,2)Modality.WINDOW_MODAL:stage阻擋所有傳入其所有者的window的輸入事件,3)Modality.APPLICATION_MODAL:stage阻擋所有來自同一個application的輸入事件

總的來說java.stage.Stage相當於Swing的JWindow,是容納java.scene.Scene的容器

javafx.scene.Scene直接繼承自java.lang.Object類,這是它的原型聲明:

@DefaultProperty(value="root")
public class Scene extends Object implements EventTarget

 

除了javafx.stage.Stage容器外,javafx.scene.Scene容器算是很高層次的容器了——事實上javafx.scene.Scene相當於Swing的JFrame,我們在Jframe這個框架/場景中添加新的元素和內容

javafx.scene.Scene是一個類似於Swing的JFrame的容器;但是javafx.scene.Scene卻是以樹的形式組織的,每一個子組件就是它的一個節點;其根節點一般是Pane面板(如StackPane、BorderPane,就是一個根節點容器,可以容納子節點,各子節點掛載在其上)

javafx.scene.Scene類是依附於javafx.stage.Stage類存在,是場景的意思;場景可以添加控件和其它用戶接口結點——通過這種方法創建應用程序的用戶界面;一個Stage必須至少有一個Scene

javafx.scene.Scene類的構造方法如下所列:

/** Creates a Scene for a specific root Node. */
Scene(Parent root)

/** Creates a Scene for a specific root Node with a specific size. */
Scene(Parent root, double width, double height)

/** Construct a scene consisting of a root, with a dimension of width and height, and specifies whether a depth buffer is created for a scene. */
Scene(Parent root, double width, double height, boolean depthBuffer)

/** Construct a scene consisting of a root, with a dimension of width and height, specifies whether a depth buffer is created for this scene and specifies whether scene anti-aliasing is requested. */
Scene(Parent root, double width, double height, boolean depthBuffer, SceneAntialising antiAliasing)

/** Creates a Scene for a specific root Node with a specific size and fill. */
Scene(Parent root, double width, double height, Paint fill)

/** Creates a Scene for a specific root Node with a fill. */
Scene(Parent root, Paint fill)

 

舉個小例子:

BorderPane root = new BorderPane();
Scene scene = new Scene(root, 400, 400);

 


這里Parent是一個抽象類,全程是javafx.scene.Parent

java.lang.Object
javafx.scene.Node // 抽象類
javafx.scene.Parent // 抽象類

 

BorderPane,看命名后綴屬於xxPane,在英文中pane是玻璃窗的意思

public class BorderPane extends Pane

java.lang.Object
javafx.scene.Node
javafx.scene.Parent
javafx.scene.layout.Region
javafx.scene.layout.Pane
javafx.scene.layout.BorderPane

 


javafx.scene.layout包里面是一系列控制布局的組件

你的第一個JavaFX程序

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javfx.stage.Stage;

public class MyJavaFX extends Application{

@Override // Override the start method in the Application class
public void start(Stage primaryStage){
// Create a scene and place a button in the scene
Button bOK = new Button("OK");
Scene scene = new Scene(bOK, 200, 250);
primaryStage.setTitle("MyJavaFX"); // Set the stage title
primaryStage.setScene(scene); // Place the scene in the stage
primaryStage.show(); // Display the stage
}

/**
* The main method is only needed for the IDE with limited
* JavFX support. Not needed for running from the command line.
*/
public static void main(String[] args){
Application.launch(args);
}

 

 

回憶前面講過的知識,讓我們把思路再次理清……

start()方法
我們繼承了Application類后就要覆寫start(Stage primaryStage)方法

@Override
public void start(Stage primaryStage){
// code goes here...
}

start()方法傳入的Stage對象在JavaFX程序加載時被加載(JavaFX的Stage是頂層容器)

main()方法
既然不是控制台應用(而是GUI應用),就不需要main()方法

不過智能的IDE通常會幫你建好main()函數,呵呵

launch()方法
看到main()方法中的launch()方法了么?那是用來啟動整個Application的(少了它可不行!)

不過,如果當你的JavaFX程序少了main()函數,沒寫launch()方法,萬能的JVM會幫你自動調用launch()方法,來啟動整個應用程序


在luanch()方法被調用后,程序跑起來了,JVM會用默認無參數構造方法構造一個Application子類(就是當前繼承了Application類的類)對象實例,並調用start()方法

statr()方法會自動將用戶接口(UI)放到場景(scene)中


前面講到,Stage是JavaFX的頂層容器,很自然的想到如果構造多個Stage對象,能達到多窗口的效果(就是這樣!)

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public class MutipleStageDemo extends Application{

@Override
public void start(Stage primaryStage){
// Create a scene and place a button in the scene
Scene scene = new Scene(new Button("OK"), 200, 250);
primaryStage.setTitle("MyJavaFX"); // Set the stage title
primaryStage.setScene(scene); // Place the scene in the stage
primaryStage.show(); // Display the stage

Stage stage = new Stage(); // Create a new stage
stage.setTitle("Second Stage"); // Set the stage title
// Set a scene with a button in the stage
stage.setScene(new Scene(new Button("New Stage"), 200, 250));
stage.show();
}
}

 

 

————————————————
版權聲明:本文為CSDN博主「鸞林居士」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/abc_12366/java/article/details/79966055


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM