4

我有一个 FXML 文件,其中包含许多我发送到普通控制器的控制器方法。但是,我最近添加了几个小处理程序,它们做非常琐碎的事情,并且想知道是否可以在 FXML 文件本身的 javascript 中执行它们。但是,我似乎遇到了一个问题:我找不到在 javascript 中获取控制器对象的文档化方法。如何在 javascript 中获取控制器对象?(不,我不能使用静态方法,因为我在很多对象上有很多这些控制器)

使用 Java 的当前代码:FXML 文件:

...
<GridPane fx:id="moveOverlay" onMouseClicked="#mouseOverlayClicked" ...>
....

和java控制器:

...
@FXML
private void mouseOverlayClicked(MouseEvent e)
{
    if (e.getClickCount() > 1)
    {
        this.enableNestedEditing();
    }
    else if (e.isControlDown())
    {
        this.selectSelf();
    }
}
...

所需的 FXML:

...
<fx:script>
var controller = [what goes here?];

function mouseOverlayClicked(e) {
    if (e.getClickCount() > 1) {
        controller.enableNestedEditing();
    else if (e.isControlDown()) {
        controller.selectSelf();
}
</fx:script>
...
<GridPane fx:id="moveOverlay" onMouseClicked="mouseOverlayClicked" ...>
...

并且java类中没有对应的事件处理程序(除了其他方法)

4

1 回答 1

2

很简单,controller已经在 fxml 的 javascript 部分中定义了。所以var controller =没有必要。

例子:

<?xml version="1.0" encoding="utf-8"?>

<?language javascript?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Button?>

<VBox xmlns:fx="http://javafx.com/fxml"
      fx:controller="fxmltest.SomeController">
    <fx:script>
        function buttonClicked() {
          controller.print("hallo");
        }
    </fx:script>
    <children>
        <Button text="John Doe" onAction="buttonClicked()"/>
    </children>
</VBox>

控制器:

package fxmltest;

import javafx.fxml.FXML;

public class SomeController {

  @FXML
  public void print(String s){
    System.out.println("from javascript: "+s);
  }
}

结果:

在此处输入图像描述

于 2013-04-22T14:34:28.707 回答