2017-10-14 7 views
3

私はいくつかの特定の要求(例えば、毎回プリンタを選択せず​​に印刷する)のためにJavaをサポートするWebベースのアプリケーションを作っています。idは私にクレイジーです。数分後にJavaFX JSObjectの動作が停止しますか?

私は、ブラウザのオブジェクトとすべてが正常に動作しインスタンス化のためのJavaFXを使用していますが、もちろん、私はJavaScriptからJavaへのコールバックを行う必要があるが、ここではコードです:

... 
... 
we.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() 
    { 
     @Override 
     public void changed(ObservableValue<? extends State> observable, State oldValue, State newValue) 
     { 
      if (newValue == Worker.State.SUCCEEDED) 
      { 
       bridge = new Bridge(); 
       JSObject jsobj = (JSObject) we.executeScript("window"); 
       jsobj.setMember("app", new Bridge()); 
      } 

      if (newValue == Worker.State.CANCELLED) 
      { 
       System.out.println(newValue); 
       System.out.println("An error accourred"); 
      } 
     } 
    }); 
    ... 
    ... 

これは動作しますが、いくつかminutestheブリッジの後stooは完全に働いて、javascriptはもうコールバックを作ることができません。私が "app"オブジェクトに対してalert()を実行しようとすると、私は未定義です。 私はJDK9を使用しています

+1

'JSObject'は、渡されたメンバーへの弱い参照しか保持していないということをあまりにも遠くまで取りすぎません。 'Bridge'インスタンスへの参照を保持してみてください。 (それはあなたが意図したように見えますが、 'JSObject'のためにまったく新しいものを作成します...) – Itai

+0

実際に@ sillyfly、あなたは正しいです。わからないことに、私はBridgeの新しいインスタンスを渡しました。なぜなら、javafxはそういったローカルな割り当てに少しでも耐性があるようです。どうもありがとう。 –

答えて

1

解決策をより明確にするために、@sillyflyのアプローチが提案しています。

すべての状態変更ごとに新しい(または私の場合はConsoleインスタンス)インスタンスを作成する代わりに、1つのインスタンスを作成し、毎回それを再割り当てします。次の行に何かがあります。

public class AppController { 
    public WebView webview; 

    @FXML 
    public void initialize() { 
     final Console console = new Console(); 
     final WebEngine engine = webview.getEngine(); 
     engine.setJavaScriptEnabled(true); 
     engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() { 
      @Override 
      public void changed(ObservableValue<? extends Worker.State> observable, Worker.State oldValue, Worker.State newValue) { 
       final JSObject window = (JSObject) engine.executeScript("window"); 
       window.setMember("console", console); 
      } 
     }); 
    } 

    public class Console { 
     public void log(String text) { 
      System.out.println("[WebView console] " + text); 
     } 
    } 
} 
関連する問題