我试图在 JavaScript 中扩展一个具体的 Java 类(来自 javafx 库的 TableCell),然后调用父类(super class)的方法。我使用 Rhino 引擎执行此操作没有问题,但在 Nashorn 上却失败了。我的代码是:
var Cell = Java.extend(fx.TableCell);
var cell = new Cell() {
updateItem: function (item, isEmpty) {
if(!isEmpty){
cell.super$setText(item);
}
}
};
return cell;
除了上面的“super$setText”语法之外,该语法早在 August 中就添加到了 nashorn 中。 ,我已经尝试了 Accessing Methods of a Superclass 中提到的 Java.super
调用。在 nashorn 指南中:
var Cell = Java.extend(fx.TableCell);
var cell = new Cell() {
updateItem: function (item, isEmpty) {
if(!isEmpty){
Java.super(cell).setText(item);
}
}
};
return cell;
当填充相应的 TableView 时,这些代码片段都会失败。 cell.super$setText
抛出 'null' 没有这样的函数“super$setText”
这让我觉得很奇怪,因为我已经粘贴了该方法的全部内容 - 封闭的 cell
变量不应该变成 null。 Java.super(cell).setText
抛出“无法调用未定义。”
我还尝试了方便的属性语法 cell.text = item
,它似乎设置了一个新的 javascript 字段而没有提示,但不执行任何操作来在 TableView 中显示文本。
我的 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 bug 还是我的源代码问题。这是正确的语法吗?我还想知道 setText
不是在 TableCell
上定义的,而是在其父类(super class)之一上定义是否重要。 nashorn 只能遍历层次结构上一级吗?
最佳答案
好吧,这一切都开始了,因为我的表格显示了我的所有 TableCells,没有任何文本。我仍然有这个问题,但我已经消除了父类(super class)方法调用问题。
我创建了一个 Java 类,将所有必需的方法直接放置在父类(super class)中,并在 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;
};
这段代码运行很好。事实上,Java.super
和 cell.super$setText
方法都可以工作。我的表格仍然拒绝显示我的文本,但这完全是另一个问题。因此看来 Nashorn 在搜索父类(super class)方法时确实只向上移动了一层,并且没有找到从继承链中更上层继承的方法。
编辑
看来我在沮丧中变得马虎了。在上面的解决方案中,我仅创建一次新的扩展类,并且在第一次调用 fx.EditableTableCell 构造函数时关闭的单元格上设置文本后。这最终会使我的表格中的所有单元格留空。发生这种情况的原因是您可能不在 updateItem 函数定义中使用 this.text = item
。无论出于何种原因,您都必须拥有对该对象的外部引用,这导致我泄漏了 cell
变量并最终导致了闭包问题。
回顾一下:Java.super
和 obj.super$methodName
都是访问直接在 Nashorn 中 JavaAdapter 父类(super class)上定义的方法的好方法,而且没有人真正掌握了闭包。
关于java - 如何在 Nashorn 中访问 super 类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21356273/