我正在尝试使用WebView实例化许多JFrame,只要打开第一个WebView后,它就会起作用,至少有一个WebView仍处于活动状态,并且JFrame(以及其他所有内容)都没有被处理掉。
经过一些检查后,似乎在关闭所有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 :(得分: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(),否则只需将静态引用设置为visible。