JavaFX 學習筆記——窗口與控件

前言

如今比較流行的桌面gui框架有WPF、WinForm、Qt、javafx等。其中WPF和WinForm目前還只能在運行Winsows上。Qt(widget)是一個很強大的跨平臺C++框架(不只是UI),但用C++寫界面實在有點蛋疼,且編譯出來的體積很大。

JavaFX是基于JAVA的開源桌面框架,筆者曾學習過Qt,打算嘗試使用Java寫桌面應用,現在網上關于JavaFX的教程不時很多,因此在這里記錄一下學習過程。

安裝和配置

JavaFX11的環境不包括在JDK中,因此要在配置好JDK11的基礎上單獨配置,具體方法可以參考JavaFX官網。

窗口構成

新建工程,在Main.java中輸入下列代碼:

public class Main extends Application {@Overridepublic void start(Stage primaryStage) throws Exception{VBox layout = new VBox();Label label = new Label("Hello world");layout.getChildren().add(label);Scene scene = new Scene(layout, 300, 300);primaryStage.setTitle("Hello World");primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

JavaFX中的Stage可以看作是窗口,Scene是窗口中的內容,調用StagesetScene函數來設置窗口內容,窗口可以在運行時切換顯示的Scene,實現Tab頁面的效果。

VBox是JavaFX中的一種布局,其中的元素縱向排列,向VBox中添加元素需要調用vbox.getChildren().add(control),如上所示。

構造Scene時傳入頂層的布局(類似Qt中QMainWindowCentralWidget)及大小。最后調用show函數將窗口顯示出來。

按鈕控件

控件(Control)是GUI框架中最重要的部分,也是用戶與程序進行交互的媒介。

在JavaFX中使用控件需要導入包,例如

import javafx.scene.control.Label;
import javafx.scene.control.*;

框架中不同控件的使用方法大同小異,這里用最常用的按鈕作為示例。

在窗口中添加按鈕

構造一個Button對象并添加到VBox中:

Button button = new Button("Click me");
VBox layout = new VBox();
layout.getChildren().add(button);Scene scene = new Scene(layout, 300, 300);
primaryStage.setScene(scene);

處理按鈕點擊事件

使用EventHandler接口

創建Handler類實現EventHandler接口

class Handler implements EventHandler<ActionEvent> {@Overridepublic void handle(ActionEvent actionEvent) {if(actionEvent.getSource() instanceof Button)((Button) actionEvent.getSource()).setText("Click me again");}
}

為按鈕注冊點擊方法

button.setOnAction(new Handler());

Button還有setOnMouseClicked,setOnTouchPressed等方法,這些是專門為處理鼠標事件及觸摸事件,setOnAction函數用來處理按鈕觸發事件(不管按鈕被哪種方式觸發,具體參考文檔)。

由代碼可以得出,setOnAction函數接收一個EventHandler接口,接口的handle方法用來處理事件。

使用匿名內部類

與上一方法同理,我們可以使用匿名內部類創建接口

button.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent actionEvent) {if(actionEvent.getSource() instanceof Button)((Button) actionEvent.getSource()).setText("Click me again");}
});

使用Lambda表達式

Java中的一些接口可以由lambda表達式代替,因此可以在setOnAction中傳入lambda表達式:

button.setOnAction(actionEvent -> {if(actionEvent.getSource() instanceof Button){((Button) actionEvent.getSource()).setText("Click me again");}
});

這樣就可以在實現簡單的事件處理器時不必再特意實現接口。

其他控件

使用其他控件的方法也都類似按鈕,使用時可以查詢文檔,或者根據IDE的代碼提示獲知函數簽名及使用方法。

多窗口

在一個桌面程序中往往有多個窗口,下面介紹添加窗口的方法。

創建窗口

添加MsgBox

public class MsgBox {public static void show(String title) {Stage window = new Stage();window.setTitle(title);Button trueButton = new Button("True");Button falseButton = new Button("False");HBox hBox = new HBox(10);    //10為元素間空隙hBox.getChildren().addAll(trueButton, falseButton);Scene scene = new Scene(hBox, 100, 100);window.setScene(scene);window.show();}
}

與主窗口創建過程相同,新建stageScene、布局及控件,最后使用Stageshow方法顯示出來。

調用MsgBox類的show方法即可顯示窗口,函數的參數為窗口的標題。

設置主窗口中的按鈕事件,點擊按鈕后會顯示一個MsgBox窗口。

button.setOnAction(actionEvent -> MsgBox.show("SubWindow"));

窗口模態

Stage對象可以使用initModality方法設置窗口模態類型

window.initModality(Modality.WINDOW_MODAL);

類型包括 Modality.NONE, Modality.WINDOW_MODAL, Modality.APPLICATION_MODAL

  • Modality.NONE: 不阻塞任何窗口
  • Modality.WINDOW_MODAL: 窗口級別的模態,僅僅阻塞與對話框關聯的窗口,用戶可以正常訪問其他窗口,適合用于多窗口的程序。
  • Modality.APPLICATION_MODAL(默認值): 應用程序級別的模態,窗口將阻塞整個程序,無法訪問程序中其他的窗口

返回子窗口的值

有時我們需要得到用戶在子窗口中的操作,例如在本文的例子中,獲知用戶點了哪一個按鈕。

接下來實現這樣的功能——點擊True按鈕就在控制臺打印true,否則打印'false'。

更改MsgBox中的代碼

public static boolean show(String title) {Stage window = new Stage();window.setTitle(title);Button trueButton = new Button("True");Button falseButton = new Button("False");trueButton.setOnAction(actionEvent -> {answer = true;window.close();});falseButton.setOnAction(actionEvent -> {answer = false;window.close();});HBox hBox = new HBox(10);hBox.getChildren().addAll(trueButton, falseButton);Scene scene = new Scene(hBox, 100, 100);window.setScene(scene);window.showAndWait();return answer;
}

show函數返回一個boolean類型的值,這個值是由點擊的按鈕決定的,按鈕點擊后會關閉窗口,返回布爾值。

設置主窗口中按鈕點擊事件

button.setOnAction(actionEvent ->
{var result = MsgBox.show("SubWindow");System.out.println(result);
});

showAndWait函數

這個函數會阻塞當前事件,直到窗口被關閉后才會返回,并執行接下類的語句。在上例中,我們顯示窗口并等待,直到點擊按鈕使窗口被關閉,才執行后面的return answer語句。

可以嘗試改為調用show方法,觀察返回的結果。

窗口的關閉

有時在用戶關閉窗口時,需要執行一定的操作,例如保存設置、確認是否退出等。

這時我們可以通過setOnCloseRequest函數設置窗口關閉時觸發的事件

window.setOnCloseRequest(windowEvent ->
{System.out.println("The window will be closed!");
});

JavaFX在關閉窗口時,首先執行這一事件處理函數,再將窗口關閉。但在某些情況下(例如確認是否關閉),我們需要在處理事件時取消窗口的關閉,這種情況下可以調用windowEventconsume方法,告訴事件系統,此事件已經被處理完畢,不必再執行其他處理動作(如關閉窗口)。

將主窗口的代碼改為:

@Override
public void start(Stage primaryStage) throws Exception {Button button = new Button("Click me");button.setOnAction(actionEvent ->{var result = MsgBox.show("SubWindow");System.out.println(result);});VBox layout = new VBox();layout.getChildren().add(button);Scene scene = new Scene(layout, 300, 300);primaryStage.setScene(scene);primaryStage.setTitle("Hello World");primaryStage.setOnCloseRequest(windowEvent -> {var result = MsgBox.show("Do you want to CLOSE?");if (result == false) {windowEvent.consume();}});primaryStage.show();
}

當用戶點擊關閉按鈕時,將會彈窗詢問是否關閉,若用戶點擊False按鈕窗口就不會被關閉。

鏈接

  1. 推薦一個很好的JavaFX教程視頻:https://youtu.be/FLkOX4Eez6o
  2. 一個適合初學者的Qt教程:https://www.devbean.net/2012/...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/280389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280389.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 用戶名、主機添加背景色

文章參考&#xff1a;PS1應用之——修改linux終端命令行各字體顏色 Linux 用戶名、主機添加背景色&#xff0c;用于生產環境&#xff0c;這樣可以減少人為的誤操作。 1 [rootzhang ~]# tail /etc/bashrc 2 ……………… 3 export PS1"\[\e[37;40m\][\[\e[37;41m\]\u\[\e[3…

python 調用文件上傳圖片簡單例子

使用方法&#xff1a; python.exe .\test.py "fileD:\img\mark_1080.png" "matchWordListRUN" "urlhttp://192.168.0.37:8081/templateMatch" test.py import requests import sysif __name__ "__main__":print(參數個數為:, len(s…

解決網站在負載均衡環境下SESSION丟失的問題

在WEB場中,動態網頁往往會因為幾臺主機做了負載而產生SESSION丟失的問題&#xff0c;網上也有很多的介紹&#xff0c;我這里只將我經歷的過程給大家分享一下&#xff1a; 系統要運行在負載平衡的 Web 場環境中&#xff0c;而系統配置文件web.config中的Session狀態卻設置為InPr…

如何從手機或PC將游戲下載到PlayStation 4

PlayStation 4 games can be huge, and take hours to download. Thankfully, you can start downloading games even when you’re away from home. All you need is Sony’s official smartphone app, or a web browser on any PC. PlayStation 4游戲可能非常龐大&#xff0c…

CML更新 | 新增百度小程序、支付寶小程序

祝所有工程師小伙伴開工大吉&#xff0c;Beatles 團隊已經開始忙碌起來了。 幾個事情要向諸位匯報一下&#xff1a; 一、新增百度小程序、支付寶小程序 發布alpha版本支持百度小程序、支付寶小程序&#xff0c;已有項目可以無縫直接運行在新增平臺&#xff0c;歡迎安裝試用&…

C#中4種深拷貝方法介紹

概述為什么要用到深拷貝呢&#xff1f;比如我們建了某個類Person&#xff0c;并且實例化出一個對象&#xff0c;然后&#xff0c;突然需要把這個對象復制一遍&#xff0c;并且復制出來的對象要跟之前的一模一樣&#xff0c;來看下我們一般會怎么做。1、利用反射實現public stat…

kaggle入門項目:Titanic存亡預測(三)數據可視化與統計分析

---恢復內容開始--- 原kaggle比賽地址&#xff1a;https://www.kaggle.com/c/titanic 原kernel地址&#xff1a;A Data Science Framework: To Achieve 99% Accuracy Step 4: Perform Exploratory Analysis with Statistics 使用描述性與圖表分析數據&#xff0c;重點在于數據可…

docker遇到問題歸納

/bin/sh^M: bad interpreter #在win下編輯的時候&#xff0c;換行結尾是\n\r &#xff0c; 而在linux下 是\n&#xff0c;所以才會有 多出來的\r #可以用以下方式解決先在控制臺cd到報錯的目錄#編輯報錯的那個文件 vi xxx.sh#利用如下命令查看文件格式 :set ff 或 :set filef…

faster rcnn訓練過程講解

http://blog.csdn.net/u014696921/article/details/60321425

firefox 擴展_如何檢查您的擴展程序是否將停止與Firefox 57一起使用

firefox 擴展With Firefox 57, scheduled for release in November 14, 2017, Mozilla will end support for legacy extensions, and only support newer WebExtensions. Here’s how to check if your extensions will stop working—and how to keep using them after Novem…

《構建之法》 讀書筆記

《構建之法》 讀書筆記 婁雨禛 PB16060356 第一部分 關于結對編程的體悟與實踐 在結對編程這一部分我曾講過很多的注意點&#xff0c;比如代碼變量命名風格、縮進風格、注釋風格&#xff0c;前后語句次序風格&#xff0c;等等。然而這里還有一些新的東西。代碼風格這個老掉牙的…

邊緣服務網格 osm-edge

本文篇幅稍長&#xff0c;閱讀本文將了解以下內容&#xff1a;?什么是 osm-edge 及其產生背景?邊緣計算與中心云計算的差異&#xff0c;以及帶來的挑戰?osm-edge 的設計及采用的技術?5 分鐘快速體驗邊緣服務網格關于 osm-edgeosm-edge 是針對邊緣計算環境設計的服務網格&am…

powershell獲取exe文件返回值

一、目的 1.powershell能簡單寫一些小腳本&#xff0c;不需要exe開發這么笨重。 2.在windows實現某個特定功能&#xff0c;做成一個exe能方便查看管理。 二、實現 1.C# code 運行結束加入返回值 Environment.ExitCode 1; //自定義數字 2.powershell 調用并獲取 需要增加…

自定義ViewGroup實現仿微信圖片選擇器

先求一個windows版本的gif制作工具&#xff01;&#xff01;&#xff01; 這個代碼只是做了簡單的選擇功能&#xff0c;圖片的壓縮與展示沒做。可以自己在接口的方法中去實現。 寫這個自定義view的初衷是為了學習LayoutParams&#xff0c;參考博客&#xff1a;http://www.jians…

[PHP] 多表外連接性能測試及優化

原文&#xff1a;https://blog.csdn.net/tang_huan_11/article/details/41925639 版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請附上博文鏈接&#xff01;轉載于:https://www.cnblogs.com/0616--ataozhijia/p/10364188.html

活水亭觀書有感其一_如何將iPad置于“信息亭”模式,將其限制為單個應用程序...

活水亭觀書有感其一An iPad makes a great “kiosk” device–a tablet restricted to one specific app for your home or small business. You can create a makeshift kiosk using the Guided Access feature, or enable Single App Mode for a true kiosk environment. iPa…

Shell字符串

一 介紹 shell程序的字符串可以用單引號&#xff0c;也可以用雙引號&#xff0c;也可以不用&#xff0c;字符串是最有用的數據類型。 二 單引號 單引號字符串的限制&#xff1a; 》單引號內的內容原樣輸出&#xff0c;單引號字符串的變量是無效的。 》單引號內不能出現單引號&a…

powershell 特殊符號處理

顯示字符串有雙引號 “ 兩個雙引號產生一個雙引號&#xff0c;這里不包括最外層的雙引號。 $a"PowerShell" """My name is $a"",this program said." 使用轉義字符 轉義序列由反引號定義&#xff0c;也就是鍵盤F1下面與波浪線同鍵…

如何使用 System.Text.Json 序列化 DateTimeOffset 為 Unix 時間戳

在 .NET 中&#xff0c;日期和時間通常使用 DateTime 或 DateTimeOffset 來表示。這兩種數據類型都可以表示日期和時間&#xff0c;但它們之間有一些明顯的區別。DateTime 是不帶時區信息的&#xff0c;而 DateTimeOffset 是帶時區偏移量的&#xff0c;可以用來表示一個特定的時…

IDEA 學習筆記之 安裝和基本配置

安裝和基本配置&#xff1a; 下載&#xff1a;https://www.jetbrains.com/idea/download/#sectionwindows 下載Zip安裝包&#xff1a; 基礎知識&#xff1a; Eclipse的工作區IDEA的項目 Eclipse的項目IDEA的模塊 修改信息提示&#xff1a;Alt/ 關閉當前窗口&#xff1a;CtrlW 自…