如何在Nashorn中转换Java类?

4

我的应用程序使用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);
        }

但关键是,我需要用Nashorn引擎将其翻译为JS。目前的代码如下:

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类。这是你所说的强制转换吗?我不太明白你的问题。 - NishM
1个回答

1
当你使用JavaScript时,不需要强制转换对象。因此,只需在对象上调用函数即可。

2
如果没有歧义的函数签名,返回True;否则在运行时会出现“无法明确选择固定元数签名”的错误。 - David J. Liszewski
请查看https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions上的“显式方法选择”以了解自行选择所需签名的方式。 示例:java.lang.System.out["println(int)"](Math.PI); - Robert Tupelo-Schneck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接