初步了解javafx
JavaFX 介紹
一提到Java的圖形界面庫,我們通常聽到的都是Swing,或者更老一點(diǎn)的AWT,包括很多書上面介紹的也都是這兩種。很多學(xué)校、培訓(xùn)班教學(xué)的也是這兩種技術(shù)。但是其實(shí)這兩種技術(shù)都已經(jīng)過時(shí)很長時(shí)間了。Swing雖然學(xué)起來也不算很難,但是用它來寫界面其實(shí)也很不好寫。因?yàn)樗慕缑婧痛a沒有做到分離,所以在編寫的時(shí)候,代碼中肯定充斥著大量坐標(biāo),修改極其不易。這方面做的比較好的就是微軟的WPF,只能說誰用誰知道。
當(dāng)然,雖然編寫客戶端圖形程序是Java的弱項(xiàng),但是Java并沒有放棄這方面的努力。今天介紹的JavaFX就是Java在編寫圖形界面程序的最新技術(shù)。如果你準(zhǔn)備使用Java編寫圖形界面程序,又沒有歷史包袱,那么強(qiáng)烈推薦使用JavaFX。
這是Oracle官網(wǎng)關(guān)于JavaFX的資源和文檔。
這是官方的示例程序,我們可以參考JavaFX的部分來學(xué)習(xí)如何使用。下面是其中一個(gè)分形的JavaFX程序,點(diǎn)擊上面的數(shù)字可以進(jìn)入不同的微觀展示,感覺有一種看病毒微觀世界的感覺,很震撼。
如何安裝
只要你安裝了最新版本的JDK 8,那么就可以使用JavaFX庫了。如果沒有安裝的話,那么趕快開始安裝吧。
快速上手
第一個(gè)程序
新建一個(gè)項(xiàng)目,然后編寫如下的類,然后編譯運(yùn)行,即可看到結(jié)果。關(guān)于這個(gè)程序不用做解釋吧。如果有學(xué)習(xí)過Swing以及其他圖形界面框架的經(jīng)驗(yàn)的話,應(yīng)該非常容易理解這段代碼。當(dāng)然由于JavaFX是新東西,所以我也順便使用Java 8的新特性——lambda表達(dá)式。
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); } }
運(yùn)行截圖如下。
用戶輸入
這個(gè)程序可以用來處理用戶登錄的情況,代碼如下,重要部分都添加了注釋。代碼的最后一部分使用setOnAction函數(shù)為按鈕添加了點(diǎn)擊事件,當(dāng)點(diǎn)擊按鈕的時(shí)候會(huì)顯示文本。
public class UserInput extends Application { @Override public void start(Stage primaryStage) throws Exception { //網(wǎng)格布局 GridPane grid = new GridPane(); grid.setAlignment(Pos.CENTER); //網(wǎng)格垂直間距 grid.setHgap(10); //網(wǎng)格水平間距 grid.setVgap(10); grid.setPadding(new Insets(25, 25, 25, 25)); //新建場(chǎng)景 Scene scene = new Scene(grid, 300, 275); primaryStage.setScene(scene); //添加標(biāo)題 Text scenetitle = new Text("Welcome"); scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20)); grid.add(scenetitle, 0, 0, 2, 1); //添加標(biāo)簽及文本框 Label userName = new Label("用戶名:"); grid.add(userName, 0, 1); TextField userTextField = new TextField(); grid.add(userTextField, 1, 1); //添加標(biāo)簽及密碼框 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("已經(jīng)登錄"); } ); primaryStage.setTitle("JavaFX Welcome"); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
程序運(yùn)行截圖如下。
這個(gè)程序其實(shí)也沒什么難點(diǎn),就是使用了網(wǎng)格布局,然后將每個(gè)元素添加到網(wǎng)格中。關(guān)于網(wǎng)格布局的屬性意義可以參考官方的圖。
用FXML設(shè)計(jì)用戶界面
現(xiàn)代圖形界面框架都支持將界面和代碼分離開,而且比較常用的描述語言是XML,例如QT的QML、WPF的XAML,當(dāng)然JavaFX也有類似的語言,叫做FXML。如果需要詳細(xì)了解FXML,可以參考Oracle官網(wǎng)的文章Introduction to FXML。
下面用FXML重寫一下上面那個(gè)小例子,每個(gè)部分都做了注釋。如果學(xué)習(xí)過其他類似描述語言的話,會(huì)發(fā)現(xiàn)這些其實(shí)都差不多。唯一需要注意的就是布局里面的fx:controller屬性,它指定一個(gè)控制器,控制器的作用就是編寫界面對(duì)應(yīng)的代碼。
<?xml version="1.0" encoding="UTF-8"?> <!--導(dǎo)入類--> <?import javafx.geometry.Insets?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.Font?> <?import javafx.scene.text.Text?> <!--設(shè)置布局--> <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>
下面就是這個(gè)FXML文件對(duì)應(yīng)的控制器,它是一個(gè)標(biāo)準(zhǔn)的Java類。在FXML中用fx:id屬性指定的ID,可以在控制器中聲明為一個(gè)類字段,通過這個(gè)字段就可以和界面組件進(jìn)行交互。同樣道理,onAction聲明的事件處理程序,在控制器中就是一個(gè)方法。注意這些字段和方法都需要使用@FXML注解進(jìn)行標(biāo)注。
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); } }
程序運(yùn)行截圖如下。
如果希望修改組件樣式,JavaFX提供了CSS接口,讓我們可以直接使用CSS文件修改樣式。首先需要在FXML文件中添加相應(yīng)樣式表的引用。文件名前面的@表示這個(gè)CSS文件和FXML文件在同一目錄下。
<GridPane> <stylesheets> <URL value="@style.css"/> </stylesheets> <GridPane/>
樣式表和普通的樣式表差不多,只不過需要添加JavaFX特有的前綴-fx-。
#btnShowPassword { -fx-background-color: deeppink; }
上面用了ID選擇器,所以對(duì)應(yīng)地,在FXML中也需要ID屬性。
<Button id="btnShowPassword" text="顯示密碼" onAction="#showPasswordButton"/>
自定義之后的程序如圖所示。這里只簡單修改了一下按鈕的背景色,其實(shí)可以更改的樣式有很多,包括程序背景等等,有興趣的同學(xué)可以自行嘗試。
總結(jié)
以上就是本文關(guān)于初步了解javafx的全部內(nèi)容,如果有同學(xué)想使用Java編寫圖形界面程序,可以考慮使用JavaFX,這是一個(gè)很不錯(cuò)的選擇。希望對(duì)大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
- javafx tableview鼠標(biāo)觸發(fā)更新屬性詳解
- Java8新特性之JavaFX 8_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- JavaFX 監(jiān)聽窗口關(guān)閉事件實(shí)例詳解
- JavaFX Application應(yīng)用實(shí)例
- 利用JavaFX工具構(gòu)建Reactive系統(tǒng)
- 基于socket和javaFX簡單文件傳輸工具
- Javafx簡單實(shí)現(xiàn)【我的電腦資源管理器】效果
- JavaFX之TableView的使用詳解
- javafx實(shí)現(xiàn)圖片3D翻轉(zhuǎn)效果方法實(shí)例
- 詳解JavaFX桌面應(yīng)用開發(fā)-Group(容器組)
相關(guān)文章
Java基礎(chǔ)開發(fā)之JDBC操作數(shù)據(jù)庫增刪改查,分頁查詢實(shí)例詳解
這篇文章主要介紹了Java基礎(chǔ)開發(fā)之JDBC操作數(shù)據(jù)庫增刪改查,分頁查詢實(shí)例詳解,需要的朋友可以參考下2020-02-02Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)
這篇文章主要介紹了Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09詳解Java中l(wèi)ist,set,map的遍歷與增強(qiáng)for循環(huán)
這篇文章主要介紹了詳解Java中l(wèi)ist,set,map的遍歷與增強(qiáng)for循環(huán)的相關(guān)資料,需要的朋友可以參考下2017-02-02MybatisPlus開啟、關(guān)閉二級(jí)緩存方法
本文主要介紹了MybatisPlus開啟、關(guān)閉二級(jí)緩存方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09關(guān)于Spring MVC同名參數(shù)綁定問題的解決方法
Spring MVC中的參數(shù)綁定還是蠻重要的,最近在使用中遇到了同名參數(shù)綁定的問題,想著總結(jié)分享出來,下面這篇文章主要給大家介紹了關(guān)于Spring MVC同名參數(shù)綁定問題的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件
這篇文章主要介紹了詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09SpringSecurity動(dòng)態(tài)加載用戶角色權(quán)限實(shí)現(xiàn)登錄及鑒權(quán)功能
這篇文章主要介紹了SpringSecurity動(dòng)態(tài)加載用戶角色權(quán)限實(shí)現(xiàn)登錄及鑒權(quán)功能,很多朋友感覺這個(gè)功能很難,今天小編通過實(shí)例代碼給大家講解,需要的朋友可以參考下2019-11-11Java內(nèi)存溢出的幾個(gè)區(qū)域總結(jié)(注意避坑!)
內(nèi)存溢出是指應(yīng)用系統(tǒng)中存在無法回收的內(nèi)存或使用的內(nèi)存過多,最終使得程序運(yùn)行要用到的內(nèi)存大于虛擬機(jī)能提供的最大內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Java內(nèi)存溢出的幾個(gè)區(qū)域,總結(jié)出來給大家提醒注意避坑,需要的朋友可以參考下2022-11-11mybatisplus?復(fù)合主鍵(多主鍵)?CRUD示例詳解
這篇文章主要介紹了mybatisplus?復(fù)合主鍵(多主鍵)?CRUD實(shí)例詳解,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03SpringBoot接收參數(shù)所有方式總結(jié)
這篇文章主要介紹了SpringBoot接收參數(shù)所有方式總結(jié),文中通過代碼示例和圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07