2017-10-14 7 views
3

일부 특정 요청 (예 : 매번 프린터를 선택하지 않고 인쇄)에 대한 Java 지원 웹 기반 응용 프로그램을 만들고 있습니다. id가 나를 드라이브하는 미친 것입니다.JavaFX JSObject가 몇 분 후에 작동을 멈 춥니 다?

내가 브라우저 객체와 모든 것이 잘 작동 인스턴스화를위한 자바 FX를 사용하지만, 물론 내가 자바 스크립트에서 자바 콜백을 확인해야합니다, 여기에 코드입니다 :

... 
... 
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는 전적으로 작동하는데 자바 스크립트는 더 이상 콜백을 할 수 없으며 "app"객체에 경고()를 보내면 정의되지 않은 값을 반환합니다. 저는 JDK9를 사용하고 있습니다

+1

'JSObject'는 전달 된 멤버에 대한 약한 참조 만 보유하고 있습니다. 'Bridge' 인스턴스에 대한 참조를 보유 할 수 있습니까? (마치 당신이 의도 한 것처럼 보이지만'JSObject'를 위해 완전히 새로운 것을 만들었습니다 ...) – Itai

+0

실제로 @sillyfly, 맞아요. 설명 할 수 없게도 나는 Bridge의 새로운 인스턴스를 통과 시켰고, 왜 그런지는 모르지만, javafx는 그런 지역 할당에 대해 조금도 관대하지 않는 것처럼 보입니다. 고마워. –

답변

1

해결책을 더 분명히하기 위해 @sillyfly가 제안한 접근 방식이 효과적입니다.

모든 모든 상태 변경에 대해 Bridge 인스턴스 (또는 내 경우 Console 인스턴스)를 만드는 대신 단일 인스턴스를 만들어 매번 다시 할당하십시오. 다음 줄에 뭔가가 있습니다.

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