単純なマルチプレイヤー ゲームの「ログ」(つまり、チャット メッセージ、ゲーム ステータス メッセージなど) を表示するために 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 でこの例外が発生したようです。
この例外の理由は何ですか? そして、この問題の解決策はありますか? 前もって感謝します。