有些问题很傻,但是我们总是犯,
有些问题很罕见,但是不幸的是我们遇到了。
有些问题很平常,但是我们不得不面对。
问题集合:
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://*.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());
}
});