JavaFx開發桌面軟件
Table of Contents
1 Awt, Swing, SWT 和 JavaFx
Java中進行界面GUI開發,總共有四種方式。
- Awt
Awt是最早開發的界面庫,為了滿足跨平台的需要,達到“一次編寫多處運行”的效果。在不同的系統下,使用系統的控件包裝成統一的調用接口。但由於每個系統下面的控件不同,甚至,很多是缺失的。所以,效果並不太好。現在基本上沒有人使用了。
- Swing
為了解決Awt在不同系統下控件不一樣的問題,開發了一套獨立運行在Java虛擬機上的控件,這就是Swing。由於它完全獨立於操作系統,所以,可以在各個系統下運行,並且基本一致。但是,由於是虛擬出來的控件,因此運行效率上稍微差一些,比較慢。另外,默認的界面比較丑,但是,有Look And Feel,類似css這種,可以通過配置修改顯示效果。精通之后,可以做很多的效果出來,但是入門比較困難,開發效率也不高。
- SWT
IBM為了開發Eclipse,開發出來的一套界面庫,它基於Awt和Swing之間,效率等各方面,相當於各取了其中的一部分。已經不推薦使用了。
- JavaFx
JavaFx是Java中的最新的界面庫,Oracle開發的。有兩種編寫模式,一種是純代碼編寫,一種是代碼+FXML。純代碼好理解,代碼+FXML是什么呢?如果熟悉html編程的話,就比較好理解了,相當於html+js來編寫界面。當然,這兩種方法都可以配合css來編寫。
http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-overview.htm
Awt | Swing | SWT | JavaFx | |
---|---|---|---|---|
優勢 | 1. 運行速度快 | 1. 多平台 | 1. 介於Awt和Swing之間 | 1. 支持控件多 |
2. 穩定 | 2. 默認控件漂亮 | |||
3. 編寫接口簡潔 | ||||
4. 開發效率高 | ||||
劣勢 | 1. 誇平台效果不好 | 1. 運行效率低 | 1. 介於Awt和Swing之間 | 1. 運行效率一般 |
2. 開發效率低 | 2. 開發效率不高 | |||
3. 接口繁瑣 | ||||
4. 默認主題界面不美觀 | ||||
5. 精通耗時長 |
2 JavaFx純代碼編寫界面
2.1 JavaFx中的布局方式
總的布局方式和Tk比較類似,分為三類:
- 絕對布局
在Tk里面,絕對布局是使用place來實現的,在JavaFx中使用Pane
可以達到類似的效果,就是一旦確定了位置,變換窗口大小時,位置始終保持不變。所有控件通過層次疊加在一起的,在Tk中通過偏移值x和y來定位,在JavaFx中通過layoutX和layoutY來定位。
- 相對布局
在Tk里面,相對布局使用是最多的,就是通過pack命令來管理和布局控件。在JavaFx中則通過VBox
和HBox
來實現pack的效果。HBox相當於,frame中的控件使用pack管理,加上參數-side left。VBox相當於,frame中的控件使用pack管理,加上參數-side top。Tk中pack的-expand選項,用VBox.setVgrow(node, Priority.ALWAYS)
和HBox.setHgrow(node, Priority.ALWAYS)
來實現。
- 表格布局
在Tk里面,表格布局是使用grid命令來進行的,在JavaFx中則使用GridPane
和TilePane
來實現。使用GridPane時,表格的大小是自適應的,使用TilePane時,表格大小是相等的。
2.2 JavaFx中的其他窗口容器
JavaFx中的窗口容器要比Tk中多很多,Tk中只有frame和labelframe兩種。而JavaFx中的窗口容器則很多:
- 和frame比較類似的是
HBox
和VBox
。
BorderPane
比較有意思,它一開始就定義了5個區域,上中下,中間又分為左中右。可以把控件裝到這幾個位置去,用來創建經典的工具欄,左邊展示樹,中間操作區,右邊顯示屬性,下面顯示消息之類的布局非常方便。
FlowPane
用來創建寬度或者高度可以調整的容器,有橫向和縱向兩個方向可以選擇。用來布置較多的按鈕或者圖片之類的控件在里面,當調整寬度或者高度時,可以自動的增加或者減少每排或每列的控件數量。比如,原來寬度是500的時候,可以顯示5個按鈕,當寬度調整到300時,顯示3個按鈕,另外2個按鈕自動換到下一排。
StackPane
用來層疊多個控件,與基礎的Pane比較類似,可以層疊,但不是通過x和y來定位,而是通過alignment來定位,可以自適應變化大小。
ScrollPane
帶滾動條的容器。
AnchorPane
通過anchor的方向,left、right、top、bottom和center等方向來對控件進行布局。
2.3 JavaFx中的控件
2.4 自適應窗口的創建
3 JavaFx中的事件
3.1 OnShown
當我們在創建時需要獲取控件的寬度和高度時,這時,由於控件並沒有show,所以,它們的寬度和高度都是0。那么,我們怎么才能獲取到正確的寬度和高度呢?
- 調用show()函數,把窗口顯示出來,但,這時程序的控件還在創建,會看到一個沒有完成的界面,不太好。
- 使用OnShown事件,就是當show()函數執行完之后,再執行callback里面的代碼。
primaryStage.setOnShown(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent e) { rect.setWidth(hbox.getWidth()); } });