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;
        }
    }

2 番目の例のクラスから public 修飾子を削除すると、この例は機能しなくなります。

于 2015-09-30T16:44:50.140 に答える