JxBrowser-JSとJAVAコードの相互作用と発生した問題

JSとJavaの相互作用はソフトウェアの精神であると言え、JxBrowserがJavaメソッドを呼び出すのは非常に簡単です。公式デモを参照してください:

browser.addScriptContextListener(new ScriptContextAdapter() {
    @Override
    public void onScriptContextCreated(ScriptContextEvent event) {
        Browser browser = event.getBrowser();
        JSValue window = browser.executeJavaScriptAndReturnValue("window");
        window.asObject().setProperty("java", new JavaObject());
    }
});

このように、Jsを使用してJavaクラスのメソッドとプロパティを自由に呼び出すことができます。これは非常に便利です。ScriptContextAdapterは、ページJSスクリプトが初期化および破棄されたときに呼び出されるJavaScriptコンテキストイベントを受信するために使用されます。

 

注:Javaメソッドの戻り値はJavaオブジェクトであり、jsオブジェクトのように呼び出すことはできませんが、Javaメソッドを呼び出す形式で呼び出すことができます。たとえば、List <String>をjsに返し、jsコードでこのリストの長さを取得したい場合、lengthを使用しても機能しませんが、size()を使用します。

public List <String> test(){...}

var list = Test.test();

エラー:alert(list.length);

正解:alert(list.size());

Javaメソッドで戻り値をJson文字列に変換してからJsに返し、JsのJSON.parse(xx)で文字列をJsオブジェクトに変換することをお勧めします。

jsでjavaコードを書くことは非常に人気があるように見えますが、しばらくすると振り返ることがあります。これは一体何を書いているのでしょうか。混合して書くのも、自分で書くのも簡単です。jsとjavaのどちらを書くのかわかりません。

Javaクラスオブジェクトをjsコードで印刷しようとしないでください。たとえば、JavaクラスオブジェクトjsObject.setProperty( "Test"、new xxxx());を追加してから、次のjsコードを実行します:alert(Test);またはconsole.log(Test); self-test。

 

デモに従ってJS呼び出しJavaオブジェクトを実装した後、指定されたJavaクラスオブジェクトを自動的に挿入するために、追加されたJavaクラスごとにjsObject.setProperty(xxx、xxx)メソッドを記述する必要はありません。JsClassアノテーションをカスタマイズしてアノテーションを使用しました。 JsClassアノテーションを含むすべてのクラスをスキャンし、それらを自動的にロードする方法。

問題があります。通常、$(document).ready(function(){});でJavaメソッドを呼び出して、一部のデータを初期化します。初期化中にXXXの無効なエラーがスローされることがあります。XXXがsetPropertyで設定されていることは明らかですが、見つかりません。このエラーが報告されない場合があります。この問題は主に、ソフトウェアを初めて起動したときに発生します。(コンピューターの構成が優れているほど、それに遭遇する可能性は低くなります)

ここでは、jsObject.setPropertyとドキュメントの読み込みが同期して実行されていると思います。これは、Javaオブジェクトがdocument.ready()の前にJavaオブジェクトをコンテキストに追加するために見つかります。しかし、ほとんどの場合、Javaオブジェクトはそれほど速くロードされません。公式文書によると、最初にJavaオブジェクトを挿入/登録してから、Webページをロードすると、登録されているすべてのJavaオブジェクトが破棄され、ロードされたWebページのJavaScriptで使用できなくなります。

多くのテストで、最初にロードされたJavaオブジェクトは無効ではない可能性が高いことがわかっています。したがって、Javaオブジェクトを1つだけロードすることをお勧めします。

ここでは、次の2つのソリューションをお勧めします。

1. 1つのJavaオブジェクトのみをロードし、Javaオブジェクトのコードは可能な限り単純です。(正直なところ、このソリューションでは未定義のJavaオブジェクトに遭遇する可能性を減らすことしかできず、プログラムの起動後しばらくするとプログラムはJavaオブジェクトを見つけることができません)[これは悪い考えです。Javaオブジェクトが定義されていない場合は、ページを再読み込みしてください]

2. document.ready()のようなメソッドを使用せず、パブリックjs関数を定義し、Webページフレームがロードされた後にJavaで呼び出します。(試しませんでした、それは実行可能だと感じます)

問題よりも常に多くの方法があります。

おすすめ

転載: blog.csdn.net/xymmwap/article/details/108902947