1

我将使用 WebView/WebEngine 来显示简单多人游戏的“日志”(即聊天消息、游戏状态消息……)。

这是我在javascript部分写的。

function addLogMessage(o) {
    var kind = o.getMessageKindCase();
    if (kind.equals(kind.CHAT_MESSAGE)) {
        $("body").append(createChatMessage(o.getChatMessage()));
    } else (/* other cases following... */)
}

function addLogMessages(l) {
    var n = l.size();
    for (var i = 0; i < n; i++) {
        addLogMessage(l.get(i));
    }
}

这是我在java部分写的。

private GameStatus gameStatus;
private WebEngine logWebEngine;
private final ObjectProperty<JSObject> window = new SimpleObjectProperty<>(this, "window");

public void initialize(URL url, ResourceBundle rb) {
    gameStatus = /* ... */;

    window.addListener((o, oldValue, newValue) -> {
        if (newValue == null) {
            return;
        }
        // getLogMessages() will return java.util.List<LogMessage>
        newValue.call("addLogMessages", gameStatus.getLogMessages());
    });

    logWebEngine = logView.getEngine();
    logWebEngine.getLoadWorker().stateProperty().addListener((o, oldValue, newValue) -> {
        if (newValue == Worker.State.SUCCEEDED) {
            window.set((JSObject) logWebEngine.executeScript("window"));
        }
    });
    logWebEngine.load(getClass().getResource("log.html").toString());
}

当我从 java 端调用 addLogMessage() 时,它按预期工作。但是,调用 addLogMessages() 会导致以下异常。

Exception in thread "JavaFX Application Thread" java.lang.IllegalAccessException: Class sun.reflect.misc.Trampoline can not access a member of class java.util.Collections$UnmodifiableCollection with modifiers "public"

似乎l.size()在 addLogMessages 中导致了这个异常。

这个异常的原因是什么?而且,这个问题有什么解决方案吗?提前致谢。

4

1 回答 1

0

zella 的评论对我很有帮助。

不工作:

DatumFunction<Double> datumFunction = new DatumFunction<Double>(){

        @Override
        public Double apply(int d) {
            String result  = "" + d;
            return value;
        }

};

是否有效:

DatumFunction<Double> datumFunction = new DoubleDatumFunction();

public class DoubleDatumFunction implements DatumFunction<Double> {
        @Override
        public String apply(int d) {
            String result  = "" + d;
            return value;
        }
    }

如果我要从第二个示例的类中删除 public 修饰符,则该示例将不再起作用。

于 2015-09-30T16:44:50.140 回答