我正在尝试找到一种方法来从 sceneController 外部和 fxml 内部调用 sceneController 中的方法,而无需使用按钮或必须执行的操作才能激活。我希望它在每次应用程序启动时运行一次。所以目前,每次程序启动时,它都会创建一个覆盖整个屏幕的 ImageView 。但是程序打开的每个人都希望出现文件夹中的随机图像。现在 imageView 有一个 fx:id,我在场景 Controller 内的一个方法中使用它来设置图像。场景 Controller 中的方法完美运行。但是问题是我希望图像在程序启动时随机生成,而不是在您按下按钮时(当前发生的情况)。控制 imageView 的方法必须在场景 Controller 内部,不能从场景 Controller 外部调用,因为它没有构造函数(试图创建一个但它导致了问题)。因为您可以从 fxml 内部调用方法(什么按钮和什么不可以)我正在尝试调用该方法来使用 JavaScript 从 fxml 文件内部设置图像,因为看起来您可以那样做。我只是想知道是否有人知道这个问题的更好解决方案。或者更好的是知道如何从 fxml 文件中的 JavaScript 内部调用 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
最佳答案
这并不完全符合您的要求,但您可能应该在 Controller 中声明一个 initialize()
方法。如果存在这样的方法,FXMLLoader将在 Controller 初始化时执行它。这样,您就不需要任何 JavaScript。
public void initialize() {
// choose your random image here
// imageView.setImage(...);
}
如果你想保持方法私有(private)/ protected ,你必须用@FXML 注释它。
另见 Controllers Introduction to FXML 中的部分指导。
注意:使用构造函数而不是 initialize()
的问题可能是,在构造时,字段(例如您的 ImageView)尚未初始化/注入(inject)(意味着它们 null
),所以你不能使用它们。
关于javascript - 如何从 javaFX 的 fxml 内部的 JavaScript 调用 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57368108/