【问题标题】:How to cast java classes in nashorn?如何在 nashorn 中转换 java 类?
【发布时间】:2018-04-07 21:52:22
【问题描述】:

在我的应用程序中,我使用 javafx,并且我有一个显示来自网站的新闻的 WebView。在此 WebView 中单击任何链接时 - 它应该在浏览器中打开它,而不是在 WebView 中。我找到了应该在 java 中工作的代码:

NodeList nodeList = document.getElementsByTagName("a");
        for (int i = 0; i < nodeList.getLength(); i++)
        {
            Node node= nodeList.item(i);
            EventTarget eventTarget = (EventTarget) node;
            eventTarget.addEventListener("click", new EventListener()
            {
                @Override
                public void handleEvent(Event evt)
                {
                    EventTarget target = evt.getCurrentTarget();
                    HTMLAnchorElement anchorElement = (HTMLAnchorElement) target;
                    String href = anchorElement.getHref();
                    //handle opening URL outside JavaFX WebView
                    System.out.println(href);
                    evt.preventDefault();
                }
            }, false);
        }

但诀窍是,我需要将其翻译成 js(使用 nashron 引擎)。这是我目前拥有的:

pane.lookup("#newsPane").getEngine().getLoadWorker().stateProperty()["addListener(javafx.beans.value.ChangeListener)"](
    function(o, ov, nv){
        if (nv == javafx.concurrent.Worker.State.SUCCEEDED) {
            // Here the things get started
            var nodes = pane.lookup("#newsPane").getEngine().getDocument().getElementsByTagName("a");
            for(var i=0;i<nodes.getLength();i++){
                var node = nodes.item(i);
                // I got node, but now i need to cast it to EventTarget, but i didn't find anywhere how to do that
                LogHelper.info(node);
                // instead of *node* there should be *eventTarget*, also i'm not sure the code above will work even with EventTarget
                node['addEventListener("click", javafx.event.EventListener)'](
                    function(evt){
                        var target = evt.getCurrentTarget();
                        var href = target.getHref();
                        LogHelper.info(href);
                        evt.preventDefault();
                    }
                )
            }
        }
    });

我找到了一些 Java.to()Java.type(),但我不知道如何使用它们进行转换(不确定是否是完全可能)。谁能给我一些建议,好吗?

【问题讨论】:

  • 您可以使用 Java.type() 语法在 JavaScript 中实例化 Java 类。这就是你说的铸造的意思吗? .没有真正得到你的问题。

标签: javascript java javafx webview nashorn


【解决方案1】:

当您使用 JavaScript 时,您不需要强制转换您的对象。所以只需调用对象上的函数即可。

【讨论】:

  • 如果没有模棱两可的函数签名,则为真,否则在运行时您会得到“无法在固定数量签名之间明确选择”。
  • 查看wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions 的“显式方法选择”,了解一种选择您自己想要的签名的方法。示例:java.lang.System.out["println(int)"](Math.PI);
猜你喜欢
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多