Javafx利用fxml變換場(chǎng)景的實(shí)現(xiàn)示例
1.fxml中的線(xiàn)程問(wèn)題
public void start(Stage stage) throws Exception { primaryStage = stage; Scene loginScene; FXMLLoader loginFxml = new FXMLLoader(mainContrller.class.getResource("/resource/fxml/loginmenu.fxml")); loginScene = new Scene(loginFxml.load()); primaryStage.initStyle(StageStyle.TRANSPARENT); primaryStage.getIcons().add(new Image("resource/img/icon.png")); primaryStage.setScene(loginScene); //這里會(huì)執(zhí)行initialize方法, //加載布局類(lèi)并且加載點(diǎn)擊事件 //在這里進(jìn)行方法的執(zhí)行,(這里對(duì)controller私有的stage進(jìn)行賦值, //然后對(duì)他進(jìn)行事件操作,之間綁定事件,但是不執(zhí)行) ((loginController)loginFxml.getController()).setStage(primaryStage); primaryStage.show(); }
在這個(gè)代碼中,在JavaFX中,FXMLLoader
是用來(lái)加載FXML文件并將其轉(zhuǎn)換為Java對(duì)象(例如控制器類(lèi))的工具。在這時(shí),就已經(jīng)創(chuàng)建了一個(gè)實(shí)例對(duì)象對(duì)應(yīng)的Controller。
當(dāng)您使用FXMLLoader
加載FXML文件時(shí),它會(huì)異步地執(zhí)行以下步驟:
- 加載FXML文件:
FXMLLoader
會(huì)從指定的URL加載FXML文件。 - 解析FXML:它會(huì)解析FXML文件,并將其轉(zhuǎn)換為Java對(duì)象,包括創(chuàng)建控制器類(lèi)的新實(shí)例。
- 綁定和布局:它會(huì)將FXML文件中的布局和控件與Java對(duì)象綁定,并設(shè)置它們的布局和樣式。
- 事件處理:它會(huì)設(shè)置控件的事件處理方法,如按鈕的點(diǎn)擊事件等。
注意:這時(shí)候你如果要想自己進(jìn)行初始化一些字體,類(lèi)型,等等... 可以寫(xiě)在Controller類(lèi)中的initialize方法中(這個(gè)名字不能變),因?yàn)樵诩虞d這個(gè)文件時(shí)會(huì)指向這個(gè)方法
(如果在進(jìn)行場(chǎng)景更換的時(shí)候,在這個(gè)方法中不能寫(xiě)對(duì)這個(gè)scene的操作,因?yàn)檫@個(gè)scene還是原來(lái)stage調(diào)用的scene,后面又進(jìn)行場(chǎng)景,相當(dāng)于沒(méi)有操作)
在整個(gè)過(guò)程中,FXMLLoader
是使用JavaFX的后臺(tái)線(xiàn)程(也稱(chēng)為JavaFX線(xiàn)程)來(lái)執(zhí)行這些操作的,這是為了保持UI線(xiàn)程的響應(yīng)性。這意味著在用戶(hù)界面(UI)線(xiàn)程中,您不會(huì)看到任何阻塞,即使FXMLLoader
正在執(zhí)行耗時(shí)的操作。
當(dāng)FXMLLoader
完成加載并調(diào)用load()
方法時(shí),它會(huì)返回一個(gè)Parent
對(duì)象,這是FXML文件中定義的根節(jié)點(diǎn)的JavaFX表示。您可以將這個(gè)Parent
對(duì)象添加到場(chǎng)景中,然后設(shè)置場(chǎng)景到舞臺(tái)上。
當(dāng)primaryStage.setScene(loginScene);
被執(zhí)行時(shí),FXMLLoader
的load()
方法已經(jīng)完成,并且loginScene
已經(jīng)被創(chuàng)建。此時(shí),loginScene
中的布局類(lèi)(控制器類(lèi))已經(jīng)被加載,并且與FXML文件中的控件綁定的事件處理方法也已經(jīng)設(shè)置好了。
后面添加代碼時(shí),就可以安全地執(zhí)行與控制器類(lèi)相關(guān)的操作,因?yàn)榭刂破黝?lèi)已經(jīng)加載并準(zhǔn)備好使用。例如,您可以調(diào)用控制器類(lèi)的方法,設(shè)置舞臺(tái)屬性等。
FXMLLoader
的load()
方法是在后臺(tái)線(xiàn)程中執(zhí)行的,以確保UI線(xiàn)程的響應(yīng)性。當(dāng)load()
方法完成后,您可以在主線(xiàn)程中安全地使用控制器類(lèi)和FXML文件中的控件。
這其中最大的坑就是要意識(shí)到initialize這個(gè)方法是要進(jìn)行初始化的,不要在這個(gè)方法中直接對(duì)controller的成員直接進(jìn)行操作(除非是賦值操作,然后再進(jìn)行更改操作)
2.不同Controller之間交互的方式
1.可以在每個(gè)controller中私有一個(gè)stage,然后再在Controller類(lèi)中創(chuàng)建一個(gè)setstage方法,可以像上面一樣執(zhí)行,對(duì)這個(gè)stage進(jìn)行賦值,然后就可以操作這個(gè)場(chǎng)景。
FXMLLoader loginFxml = new FXMLLoader(mainContrller.class.getResource("/resource/fxml/loginmenu.fxml")); loginScene = new Scene(loginFxml.load()); //這里執(zhí)行controller類(lèi)中的方法 //這個(gè)((loginController)loginFxml.getController())已經(jīng)是個(gè)實(shí)例對(duì)象了 ((loginController)loginFxml.getController()).setStage(primaryStage);
2.可以在主控制類(lèi)中公開(kāi)這個(gè)stage,并設(shè)置這個(gè)靜態(tài)的,其它的controller直接在initialize里面進(jìn)行賦值操作。
3.兩個(gè)選項(xiàng)小功能
密碼的可視化(這操作感覺(jué)很復(fù)雜,也不知道有沒(méi)有簡(jiǎn)單方法)
首先是一個(gè)toggleButton設(shè)置一個(gè)按鈕,能夠判斷是否點(diǎn)擊可視化,然后在密碼文本那里要設(shè)置兩個(gè)文本,一個(gè)password,一個(gè)普通文本,普通文本要綁定password文本,并且要設(shè)置普通文本不可操作disable ="true";
ToggleButton eyeButton; eyeButton.selectedProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { if (newValue ) { System.out.println("isSelected"); eyeButton.setText(eyeUnicode); passwordFiled.setVisible(true); passwordFiledOut.setVisible(false); } else { eyeButton.setText(uneyeUnicode); passwordFiled.setVisible(false); passwordFiledOut.setVisible(true); } } });
這里監(jiān)聽(tīng)toggleButton是否點(diǎn)擊,可以判斷是否想要能夠可視選項(xiàng)
到此這篇關(guān)于Javafx利用fxml變換場(chǎng)景的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Javafx fxml變換場(chǎng)景內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java Aop實(shí)現(xiàn)自動(dòng)填充字段值示例
這篇文章主要為大家介紹了Aop實(shí)現(xiàn)自動(dòng)填充字段值示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Java源碼解析CopyOnWriteArrayList的講解
今天小編就為大家分享一篇關(guān)于Java源碼解析CopyOnWriteArrayList的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01Java實(shí)現(xiàn)簡(jiǎn)單字符生成器代碼例子
這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單字符生成器代碼例子,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06Java實(shí)現(xiàn)的二叉樹(shù)常用操作【前序建樹(shù),前中后遞歸非遞歸遍歷及層序遍歷】
這篇文章主要介紹了Java實(shí)現(xiàn)的二叉樹(shù)常用操作,包括二叉樹(shù)的前序建樹(shù),前中后遞歸非遞歸遍歷及層序遍歷等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Spring實(shí)現(xiàn)在非controller中獲取request對(duì)象
這篇文章主要介紹了Spring實(shí)現(xiàn)在非controller中獲取request對(duì)象方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08淺析Spring IOC bean為什么默認(rèn)是單例
單例的意思就是說(shuō)在 Spring IoC 容器中只會(huì)存在一個(gè) bean 的實(shí)例,無(wú)論一次調(diào)用還是多次調(diào)用,始終指向的都是同一個(gè) bean 對(duì)象,本文小編將和大家一起分析Spring IOC bean為什么默認(rèn)是單例,需要的朋友可以參考下2023-12-12解決SpringBoot打成jar運(yùn)行后無(wú)法讀取resources里的文件問(wèn)題
這篇文章主要介紹了解決SpringBoot打成jar運(yùn)行后無(wú)法讀取resources里的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08一個(gè)通用的Java分頁(yè)基類(lèi)代碼詳解
這篇文章主要介紹了一個(gè)通用的Java分頁(yè)基類(lèi)代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12