如何在 javaFX 的 fxml 中从 JavaScript 内部调用 java 方法
How to call a java method from inside JavaScript inside fxml for javaFX
我正在尝试找到一种方法来从 sceneController 外部和 fxml 内部调用 sceneController 中的方法,而无需使用按钮或必须执行的操作才能激活。每次应用程序启动时,我都希望它 运行 一次。所以目前,每次程序启动时,它都会创建一个覆盖整个屏幕的图像视图。但是程序打开的每个人都希望出现文件夹中的随机图像。现在 imageView 有一个 fx:id ,我在场景控制器内部的方法中使用它来设置图像。场景控制器中的方法完美运行。但是问题是我希望图像在程序启动时随机生成,而不是在您按下按钮时(当前发生的情况)。控制 imageView 的方法必须在场景控制器内部,不能从场景控制器外部调用,因为它没有构造函数(试图创建一个但它导致了问题)。因为你可以从 fxml 内部调用方法(什么按钮和什么不做)我正在尝试调用方法来使用 JavaScript 从 fxml 文件内部设置图像,因为看起来你可以那样做.我只是想知道是否有人知道这个问题的更好解决方案。或者更好的是知道如何从 fxml 文件中的 Java 脚本内部调用 java 方法。
所以我正在使用 JavaFX 为我正在尝试构建的程序构建一个 GUI,我有点菜鸟。现在,在我开始构建程序的业务端之前,我正试图获得一个美观且可用的 GUI。我正在使用 eclipse 4.6 和 Java 8.
<VBox xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.initSceneController" >
<fx:script>
var executeOnce = false;
if(executeOnce === false) {
#setBackground;
executeOnce = true;
}
else {
}
</fx:script>
所以我希望 fxml 文件中的这段代码实际上会在 sceneHandeler 中调用一个名为 setBackground 的方法,但它只是给我错误:
<eval>:5:5 Expected an operand but found error
#setBackground;
^ in <eval> at line number 5 at column number 5
这不完全是您要求的,但您可能应该在控制器中声明一个 initialize()
方法。如果存在这样的方法,FXMLLoader 将在控制器初始化时执行它。这样,您就不需要任何 JavaScript.
public void initialize() {
// choose your random image here
// imageView.setImage(...);
}
如果你想保留方法private/protected,你必须用@FXML 注释它。
另请参阅 Controllers section in Introduction to FXML 指南。
注意:使用构造函数而不是 initialize()
时的问题可能是,在构造时,字段(f.i。您的 ImageView)尚未 initialized/injected(表示它们是 null
),因此您不能使用它们。
我正在尝试找到一种方法来从 sceneController 外部和 fxml 内部调用 sceneController 中的方法,而无需使用按钮或必须执行的操作才能激活。每次应用程序启动时,我都希望它 运行 一次。所以目前,每次程序启动时,它都会创建一个覆盖整个屏幕的图像视图。但是程序打开的每个人都希望出现文件夹中的随机图像。现在 imageView 有一个 fx:id ,我在场景控制器内部的方法中使用它来设置图像。场景控制器中的方法完美运行。但是问题是我希望图像在程序启动时随机生成,而不是在您按下按钮时(当前发生的情况)。控制 imageView 的方法必须在场景控制器内部,不能从场景控制器外部调用,因为它没有构造函数(试图创建一个但它导致了问题)。因为你可以从 fxml 内部调用方法(什么按钮和什么不做)我正在尝试调用方法来使用 JavaScript 从 fxml 文件内部设置图像,因为看起来你可以那样做.我只是想知道是否有人知道这个问题的更好解决方案。或者更好的是知道如何从 fxml 文件中的 Java 脚本内部调用 java 方法。
所以我正在使用 JavaFX 为我正在尝试构建的程序构建一个 GUI,我有点菜鸟。现在,在我开始构建程序的业务端之前,我正试图获得一个美观且可用的 GUI。我正在使用 eclipse 4.6 和 Java 8.
<VBox xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.initSceneController" >
<fx:script>
var executeOnce = false;
if(executeOnce === false) {
#setBackground;
executeOnce = true;
}
else {
}
</fx:script>
所以我希望 fxml 文件中的这段代码实际上会在 sceneHandeler 中调用一个名为 setBackground 的方法,但它只是给我错误:
<eval>:5:5 Expected an operand but found error
#setBackground;
^ in <eval> at line number 5 at column number 5
这不完全是您要求的,但您可能应该在控制器中声明一个 initialize()
方法。如果存在这样的方法,FXMLLoader 将在控制器初始化时执行它。这样,您就不需要任何 JavaScript.
public void initialize() {
// choose your random image here
// imageView.setImage(...);
}
如果你想保留方法private/protected,你必须用@FXML 注释它。
另请参阅 Controllers section in Introduction to FXML 指南。
注意:使用构造函数而不是 initialize()
时的问题可能是,在构造时,字段(f.i。您的 ImageView)尚未 initialized/injected(表示它们是 null
),因此您不能使用它们。