有些問題很傻,但是我們總是犯,
有些問題很罕見,但是不幸的是我們遇到了。
有些問題很平常,但是我們不得不面對。
問題集合:
1.maven集成問題,
已解決,在本博另一篇文章裏。
2.maven jfx:run無反應問題,
其實是我犯了一個低級錯誤,就是沒有primaryStage.show().讓stage顯示。這個需要注意。很容易漏。
後續遇到問題時會更新本文。。。。
3. GridPane中add(node,columnindex,rowindex),
注意第一個索引指的是列,第二個索引指的是行,如gridpane.add(btn,1,3) 指添加btn到第2列,第4行。
4.maven下讀取資源文件的問題:
讀取css文件
maven默認將css文件放在src/main/resources/styles/xby.css被打包成jar之後目錄結構變爲/styles/xby.css
所以我們讀取資源文件時應該採用:MainApp.class.getResource("/styles/MainApp.css").toExternalForm();得到string形式的url
css讀取jpg文件:css文件可不是java文件可以使用java的類加載器類讀取資源文件。那麼這該怎麼辦呢?
本人嘗試如下:
將jpg文件放在src/main/resources/images目錄下面:
-fx-background-image: url("../images/background.jpg"); 成功。
-fx-background-image: url("/images/background.jpg"); 失敗
jpg與css處於同一目錄 下:
-fx-background-image: url("background.jpg"); /*jpg與css處於同一目錄 */ 成功。
5.fxml中讀取css文件的路徑問題:
按照官方說明的<stylesheets><URL value="@xby.css" /></stylesheets>本人嘗試多次並沒有成功,(CSS文件與FXML文件在同一目錄下。)
在github上發現一例子,是通過UI組件的stylesheets屬性來引用css文件的。
<GridPane stylesheets="@xby.css">成功。
原因爲何,確實讓人困惑。不過既然有這個屬性,我們就通過屬性的方式來達到這個目的吧。
參考:http://stackoverflow.com/questions/16374235/resources-and-config-loading-in-maven-project
6.javafx代碼中訪問從FXML文件中特定的Control UI組件
從javafx代碼中訪問fxml中的特定UI組件:通過Parent的lookup方法。
lookup()可以通過css選擇器的方式來進行UI組件元素的訪問。
Parent root = FXMLLoader.load(me.getClass().getResource("Form.fxml"));
Label lblData = (Label) root.lookup("#lblData");
if (lblData!=null) lblData.setText(strData);
For example, if a Node is given the id of "myId", then the lookup method can be used to find this node as follows:
scene.lookup("#myId");
.7.javafx FXML Controller中訪問同一類型的UI組件的不同實例:
比如我的Controller類中有兩個Button
@FXML private Button myButton1;
@FXML private Button myButton2;
而fxml文件中
<Button fx:id="myButton1"/> //fx:id代表着Controller類中的field
<Button fx:id="myButton2"/>
那麼FXMLLoader如何區分這兩個button呢,通過fx:id與變量名字匹配來進行區分。所以一定要滿足這種對應關係
8.javafx設置應用或窗口圖標
stage.getIcons().add(new Image("/path/to/icon.jpg"));
9.退出程序:
System.exit(0);
10.添加上下文菜單:
//adding context menu
final ContextMenu cm = new ContextMenu();
MenuItem cmItem1 = new MenuItem("Print");
cm.getItems().add(cmItem1);
toolBar.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent e) -> {
if (e.getButton() == MouseButton.SECONDARY) {
cm.show(toolBar, e.getScreenX(), e.getScreenY());
}
});