1

我正在尝试在 JavaScript 中扩展一个具体的 Java 类(来自 javafx 库的 TableCell),然后在超类上调用一个方法。我用 Rhino 引擎做这个没有问题,但它在 Nashorn 上失败了。我的代码是:

var Cell = Java.extend(fx.TableCell);

var cell = new Cell() {
  updateItem: function (item, isEmpty) {
    if(!isEmpty){
     cell.super$setText(item);
    }
  }
};

return cell;

除了上面在8 月添加到 nashorn 的“super$setText”语法之外,我还尝试了 nashorn 指南中访问超类方法中Java.super提到的调用:

var Cell = Java.extend(fx.TableCell);

var cell = new Cell() {
  updateItem: function (item, isEmpty) {
    if(!isEmpty){
     Java.super(cell).setText(item);
    }
  }
};

return cell;

当填充相应的表视图时,这些片段都失败了。cell.super$setTextthrows'null' has no such function "super$setText"这让我觉得很奇怪,因为我已经粘贴了该方法的全部内容 - 封闭变量应该不可能cell变为 null。Java.super(cell).setText抛出“不能调用未定义。”

我还尝试了方便的属性语法cell.text = item,它似乎设置了一个新的 javascript 字段而没有抱怨,但没有在表格视图中显示文本。

我的 JDK8 版本是最近的

C:\> java -version  
java version "1.8.0-ea"  
Java(TM) SE Runtime Environment (build 1.8.0-ea-b124)  
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b66, mixed mode)

我无法辨别这是一个 nashorn 错误,还是我的来源有问题。这是正确的语法吗?我还想知道它是否重要,setText它没有定义在 上TableCell,而是它的超类之一。nashorn 是否只能向上遍历层次结构?

4

1 回答 1

1

Welp,这一切都开始了,因为我的表格显示了我所有的 TableCells,没有任何文本。我仍然有这个问题,但我已经消除了超类方法调用问题。

我创建了一个 Java 类,将所有必需的方法直接放在超类中,并从我的 JavaScript 中使用它。类源码如下:

public class JsTextTableCell<S,T> extends javafx.scene.control.TableCell<S, T> {

    public void setText(Object text){
        System.out.println("In java, calling setText(" + text.toString() + ")");
        super.setText(text.toString());
    }
}

然后我将我的javascript更改为:

fx.EditableTextTableCell = function () {
  var cell;
  if(!fx.EditableTextTableCell.Class) {
    fx.EditableTextTableCell.Class = Java.extend(fx.JsTextTableCell, {
      updateItem: function (item, isEmpty) {
        if(!isEmpty){
          cell.super$setText(item);
        }
      }
    });
  }

  cell = new fx.EditableTextTableCell.Class();

  return cell;
};

这段代码运行得很好。事实上,和方法都有效我的桌子仍然拒绝显示我的文字,但这完全是另一个问题。所以看起来 Nashorn 在搜索超类方法时确实只向上移动了一级,并没有找到从继承链更上层继承的方法。Java.supercell.super$setText

编辑

似乎我在沮丧中变得草率了。在我上面的解决方案中,我只创建了一次新的扩展类,并且在第一次调用 fx.EditableTableCell 构造函数时在它关闭的单元格上设置了文本之后就在那里。这最终将我表格中的所有单元格留空。发生这种情况的原因是您可能不会this.text = item在 updateItem 函数定义中使用。无论出于何种原因,您都必须对该对象进行外部引用,这导致我泄漏cell变量并最终导致关闭问题。

回顾一下Java.superobj.super$methodName都是访问直接在 Nashorn 中的 JavaAdapter 的超类上定义的方法的好方法,而且没有人真正掌握过闭包。

于 2014-01-25T22:48:59.133 回答