2014-11-04 89 views
1

我想用WebView实例化许多JFrames,它将工作,只要打开第一个WebView后,至少有一个WebView仍然活着,并且JFrame(以及其他一切)不处理。WebView不能再工作后关闭

经过一番检查后,似乎在关闭所有WebView JFrame之后,Platform.runLater()不再运行在带有WebViewPanel的JFrame的下一个实例上。

以下是简化代码:

public class WebViewPanel{ 
    private JFXPanel jfxPanel; 
    private WebView view; 
    private WebEngine webEngine; 
    private JPanel panel; 
    public WebViewPanel(JPanel panel){ 
     this.panel = panel; 
     panel.setVisible(true); 
     createScene(); 

    } 
    private void createScene(){ 
     Platform.runLater(new Runnable(){ 
      @Override 
      public void run(){ //Runnable no longer runs after all JFrames with WebViewPanels are closed 
       jfxPanel = new JFXPanel(); 
       view = new WebView(); 
       webEngine = view.getEngine(); 
       jfxPanel.setScene(new Scene(view)); 
       panel.add(jfxPanel); 
       jfxPanel.setVisible(true); 
      } 
     }); 
    } 
} 

所以,我必须做什么来解决这个问题呢?

+0

我认为你应该使用[JFXPanel](http://docs.oracle.com/javase/8/javafx/api/javafx/embed/swing/JFXPanel.html)。也许它在那里,你只是简化了你的代码示例。 [MVCE](http://stackoverflow.com/help/mcve)可能会有所帮助。 – jewelsea 2014-11-05 00:29:17

回答

0

发生这种情况是因为如果未明确设置,平台会自行退出。

这里就是你需要做的只是后

Platform.runLater(new Runnable(){ // ..code 

在第一行

因此新的代码将被添加Platform.setImplicitExit(false);什么 -

private void createScene(){ 

    Platform.runLater(new Runnable(){ 
    Platform.setImplicitExit(false); 
     @Override 
     public void run(){ 
      jfxPanel = new JFXPanel(); 
      view = new WebView(); 
      webEngine = view.getEngine(); 
      jfxPanel.setScene(new Scene(view)); 
      panel.add(jfxPanel); 
      jfxPanel.setVisible(true); 
     } 
    }); 
} 

仅供参考,如果你想不止一次显示面板,不需要调用createScene()将JFXPanel添加到JFrame(首选面板也可以正常工作)并带有静态引用。配置框架关闭它,当你需要显示这个简单地设置相同的框架setVisibale(true);。每次调用这个框架,你也可以检查这个框架的静态引用是否指向null(表示第一次调用),然后调用createscene(),否则只是将静态引用设置为可见。