javafx遭遇的问题记录集合,不断更新。。。。。。。

时间:2022-09-03 07:29:46

有些问题很傻,但是我们总是犯,

有些问题很罕见,但是不幸的是我们遇到了。

有些问题很平常,但是我们不得不面对。


问题集合:

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"); .
lookup还支持选择器如:.button, .password-field这样的类/元素选择器<Button>,<PasswordField>,(但是目前类选择器不支持text,hbox等)
推荐现阶段仅使用id选择器。

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.退出程序:

 Platform.exit();
  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());
            }
        });
11.Dialog对话框不存在问题
ControlsFX开源库中含有对话框组件