持續更新我在使用JavaFX Scene Builder的過程中遇到的問題和解決辦法!
我一般的開發步驟:首先是在Javafx Scene Builder中設計好界面的布局,將界面中要做的事情做完,包括定義控制器類,定義簡單的style,定義事件方法,然后將整個FXML文件和用到的資源文件(圖片等)一起復制到Eclipse(安裝了Javafx開發插件的版本,詳情請看我的Javafx第一篇中所需要的軟件)中,最后就是在程序中用FXMLLoader去加載它顯示出來,查看效果如何。
1.一般不要在JavaFX Scene Builder中添加樣式!它會在相應的元素element中添加一個styleClass的屬性,但是如果在程序中運行時總是會報一個錯誤,如果想用CSS來設置每個元素的樣式的話建議手動操作!在FXML文件中要設置樣式的元素添加一個子節點,如下所示即可!
但是糾結的是,如果在程序中改好了之后,重新在JavaFX Scene Builder中進行界面設計時,JavaFX Scene Builder會將你添加的styleclass刪除掉,很多時候處理他們之間的
同步很困難,所以最好做好同步!
2.在使用JavaFX Scene Builder的過程中,經常會出現右邊的屬性面板出現假死現象,可以resize一下該面板就好了,這個是官網上發現了的已知的bug
3.在本地化的時候,一般我們都是在FXML文件中使用 %BundleText 來綁定特定的properties文件中的某個鍵值對,但是這里會出現一些問題。例如,將一個Label的text設置為
%Message,那么對應的FXML文件將生成的代碼是 text="\%Message",因為%是特殊字符,所以要用反斜線來轉義,但是這樣一來,就會很麻煩!因為復制到Eclipse中時,Eclipse會報錯!原因就在於用於轉義的 “\”,它會發現這個斜線是多余的,所以我想了一個辦法:%是需要轉移的,但是*是不需要的,而且界面是文本中一般不會出現*,所以,在開發界面時如果是要從屬性文件中讀取相應的文字的話,那么我就定義成 *Message 形式的文本,然后復制到Eclipse中之后,再利用Eclipse的替換功能,注意不能是直接將所有的*換成%,因為FXML文件頭部的import元素中也還存在*,所以最好是使用text="%替換text="*,保證萬無一失!同理,如果你只是修改了Eclipse中的FXML文件,如果想要復制文件內容同步到Javafx scene builder中的話你就要將%替換成*即可!呵呵,很方便吧!不過還是希望Javafx scenebuilder能夠更加的智能!
還有一個需要注意的問題就是,如果你希望某個label或者text開始時為空字符串,(比如這個label就是顯示錯誤信息的,但是初始時肯定是沒有的),一般是設置了text為“”,不過最好是能夠使用“*Message”,然后在properties文件中設置一下它的初值為空字符串,以免出錯!
4.在Javafx scene builder中使用圖片:點擊File,選擇Import,然后選中一張圖片即可,工具會自動生成一個ImageView!注意,圖片文件名最好不要有空格,不然這次顯示正常,下次可能就會出錯!如果這張圖片在當前的FXML文件所在的目錄下或者子目錄下,那么對應的url使用的是相對路徑,一般是這樣子: url="@background-shadow.png" ,但是如果是在當前的FXML文件的父目錄或者其他的目錄中的話,生成的url是使用絕對路徑!例如:url="file:/D:/yinger/My%20DBank/workspace_fxml/apple.png"
同理,要想在JavaFx Scene Builder中使用視頻或者音頻等等,也是使用同樣的方法!更加有用的是,你可以導入其他的FXML文件到當前的FXML文件中,這個十分方便我們實現組件復用!工具會自動的生成相應的導入代碼,例如:<fx:include source="PageView.fxml" />,除此之外,更新被導入的FXML文件中的內容會同步到這個文件中!
5.一般默認情況下新建的FXML文件的根節點都是AnchorPane,但是有時候我們並不想讓根節點是它,比如想讓根節點是StackPane,但是如果在JavaFx Scene Builder中卻是不允許刪除根節點的,怎么辦呢?很簡單的,修改FXML源文件!直接將源文件中根節點的AnchorPane改成StackPane即可,然后就可以看到效果了!
6.Javafx scene builder有一個很好的功能,點擊View,選中Show Outlines可以查看布局的網格線!
7.點擊Hierarchy面板右方的小小的向下的箭頭,快捷顯示fx:id/id/info功能,info一般是顯示GridPane的表格大小(列*行)