JavaFX 簡介

JavaFX 介紹

一提到Java的圖形界面庫,我們通常聽到的都是Swing,或者更老一點的AWT,包括很多書上面介紹的也都是這兩種。很多學校、培訓班教學的也是這兩種技術。但是其實這兩種技術都已經過時很長時間了。Swing雖然學起來也不算很難,但是用它來寫界面其實也很不好寫。因為它的界面和代碼沒有做到分離,所以在編寫的時候,代碼中肯定充斥著大量坐標,修改極其不易。這方面做的比較好的就是微軟的WPF,只能說誰用誰知道。

當然,雖然編寫客戶端圖形程序是Java的弱項,但是Java并沒有放棄這方面的努力。今天介紹的JavaFX就是Java在編寫圖形界面程序的最新技術。如果你準備使用Java編寫圖形界面程序,又沒有歷史包袱,那么強烈推薦使用JavaFX。

這是Oracle官網關于JavaFX的資源和文檔

這是官方的示例程序,我們可以參考JavaFX的部分來學習如何使用。下面是其中一個分形的JavaFX程序,點擊上面的數字可以進入不同的微觀展示,感覺有一種看病毒微觀世界的感覺,很震撼。

分形示例程序

如何安裝

只要你安裝了最新版本的JDK 8,那么就可以使用JavaFX庫了。如果沒有安裝的話,那么趕快開始安裝吧。

快速上手

第一個程序

新建一個項目,然后編寫如下的類,然后編譯運行,即可看到結果。關于這個程序不用做解釋吧。如果有學習過Swing以及其他圖形界面框架的經驗的話,應該非常容易理解這段代碼。當然由于JavaFX是新東西,所以我也順便使用Java 8的新特性——lambda表達式。

package yitian.javafxsample;

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

public class HelloJavaFX extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Button btn = new Button();
        btn.setText("你好啊,世界");
        btn.setOnAction(event -> {
            System.out.println("你好,世界!");
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }


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

運行截圖如下。

運行截圖

用戶輸入

這個程序可以用來處理用戶登錄的情況,代碼如下,重要部分都添加了注釋。代碼的最后一部分使用setOnAction函數為按鈕添加了點擊事件,當點擊按鈕的時候會顯示文本。

public class UserInput extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        //網格布局
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        //網格垂直間距
        grid.setHgap(10);
        //網格水平間距
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));
        //新建場景
        Scene scene = new Scene(grid, 300, 275);
        primaryStage.setScene(scene);
        //添加標題
        Text scenetitle = new Text("Welcome");
        scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
        grid.add(scenetitle, 0, 0, 2, 1);
        //添加標簽及文本框
        Label userName = new Label("用戶名:");
        grid.add(userName, 0, 1);

        TextField userTextField = new TextField();
        grid.add(userTextField, 1, 1);
        //添加標簽及密碼框
        Label pw = new Label("密碼:");
        grid.add(pw, 0, 2);

        PasswordField pwBox = new PasswordField();
        grid.add(pwBox, 1, 2);
        //添加提交按鈕
        Button btn = new Button("登錄");
        HBox hbBtn = new HBox(10);
        hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
        hbBtn.getChildren().add(btn);
        grid.add(hbBtn, 1, 4);
        //提交文本提示
        final Text actiontarget = new Text();
        grid.add(actiontarget, 1, 6);

        btn.setOnAction(event -> {
            actiontarget.setFill(Color.FIREBRICK);
            actiontarget.setText("已經登錄");
        });

        primaryStage.setTitle("JavaFX Welcome");
        primaryStage.show();
    }

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

程序運行截圖如下。

運行截圖

這個程序其實也沒什么難點,就是使用了網格布局,然后將每個元素添加到網格中。關于網格布局的屬性意義可以參考官方的圖。

官方示意圖

用FXML設計用戶界面

現代圖形界面框架都支持將界面和代碼分離開,而且比較常用的描述語言是XML,例如QT的QML、WPF的XAML,當然JavaFX也有類似的語言,叫做FXML。如果需要詳細了解FXML,可以參考Oracle官網的文章Introduction to FXML

下面用FXML重寫一下上面那個小例子,每個部分都做了注釋。如果學習過其他類似描述語言的話,會發現這些其實都差不多。唯一需要注意的就是布局里面的fx:controller屬性,它指定一個控制器,控制器的作用就是編寫界面對應的代碼。

<?xml version="1.0" encoding="UTF-8"?>
<!--導入類-->
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<!--設置布局-->
<GridPane xmlns="http://javafx.com/javafx"
          xmlns:fx="http://javafx.com/fxml"
          fx:controller="yitian.javafxsample.Controller"
          prefHeight="400.0" prefWidth="600.0"
          alignment="center" hgap="10" vgap="10">
    <padding>
        <Insets top="25" right="25" bottom="10" left="25"/>
    </padding>
    <!--歡迎文本-->
    <Text text="Welcome"
          GridPane.columnIndex="0" GridPane.rowIndex="0"
          GridPane.columnSpan="2">
        <font>
            <Font name="Consolas" size="20"/>
        </font>
    </Text>

    <Label text="用戶名:"
           GridPane.columnIndex="0" GridPane.rowIndex="1"/>

    <TextField
            GridPane.columnIndex="1" GridPane.rowIndex="1"/>

    <Label text="密碼:"
           GridPane.columnIndex="0" GridPane.rowIndex="2"/>

    <PasswordField fx:id="passwordField"
                   GridPane.columnIndex="1" GridPane.rowIndex="2"/>
    <!--按鈕及提示文本-->
    <HBox spacing="10" alignment="bottom_right"
          GridPane.columnIndex="1" GridPane.rowIndex="4">
        <Button text="顯示密碼"
                onAction="#showPasswordButton"/>
    </HBox>

    <Text fx:id="hintText"
          GridPane.columnIndex="0" GridPane.columnSpan="2"
          GridPane.halignment="RIGHT" GridPane.rowIndex="6"/>
</GridPane>

下面就是這個FXML文件對應的控制器,它是一個標準的Java類。在FXML中用fx:id屬性指定的ID,可以在控制器中聲明為一個類字段,通過這個字段就可以和界面組件進行交互。同樣道理,onAction聲明的事件處理程序,在控制器中就是一個方法。注意這些字段和方法都需要使用@FXML注解進行標注。

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.PasswordField;
import javafx.scene.text.Text;


public class Controller {
    @FXML
    private Text hintText;
    @FXML
    private PasswordField passwordField;

    @FXML
    protected void showPasswordButton(ActionEvent event) {
        hintText.setText("顯示密碼:" + passwordField.getText());
    }
}

最后要做修改的就是主程序了。在主程序中需要使用FXMLLoader來加載FXML資源,其他部分沒有太大變化。

public class UseFxml extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("ui.fxml"));

        Scene scene = new Scene(root, 300, 275);
        primaryStage.setTitle("使用FXML");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

程序運行截圖如下。

運行截圖

如果希望修改組件樣式,JavaFX提供了CSS接口,讓我們可以直接使用CSS文件修改樣式。首先需要在FXML文件中添加相應樣式表的引用。文件名前面的@表示這個CSS文件和FXML文件在同一目錄下。

<GridPane>
    <stylesheets>
        <URL value="@style.css"/>
    </stylesheets>
<GridPane/>

樣式表和普通的樣式表差不多,只不過需要添加JavaFX特有的前綴-fx-

#btnShowPassword {
    -fx-background-color: deeppink;
}

上面用了ID選擇器,所以對應地,在FXML中也需要ID屬性。

<Button id="btnShowPassword" text="顯示密碼"
                onAction="#showPasswordButton"/>

自定義之后的程序如圖所示。這里只簡單修改了一下按鈕的背景色,其實可以更改的樣式有很多,包括程序背景等等,有興趣的同學可以自行嘗試。

程序截圖

以上就是這篇文章的內容了。如果有同學想使用Java編寫圖形界面程序,可以考慮使用JavaFX,這是一個很不錯的選擇。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容