JavaFXWebView在后台加载页面

JavaFXWebView在后台加载页面,webview,javafx-2,javafx,Webview,Javafx 2,Javafx,我在使用JavaFXWebView时遇到问题。我想要实现的是在后台预取一个web页面,并仅在页面完全加载时将其可视化 我制作了一个简单的exmaple程序来重现这个问题。加载页面后,我启用一个按钮。然后单击此按钮可使WebView可见 我遇到的问题是,如果我在按钮启用时单击该按钮,网页将无法直接看到。取而代之的是以下情况:首先是一个完全白色的面板,然后在很短的时间后,网页是可见的。我不明白为什么这个页面不能直接看到。我怎样才能做到网页是直接可见的呢 以下链接指向显示行为的动画gif: 导入ja

我在使用JavaFXWebView时遇到问题。我想要实现的是在后台预取一个web页面,并仅在页面完全加载时将其可视化

我制作了一个简单的exmaple程序来重现这个问题。加载页面后,我启用一个按钮。然后单击此按钮可使WebView可见

我遇到的问题是,如果我在按钮启用时单击该按钮,网页将无法直接看到。取而代之的是以下情况:首先是一个完全白色的面板,然后在很短的时间后,网页是可见的。我不明白为什么这个页面不能直接看到。我怎样才能做到网页是直接可见的呢

以下链接指向显示行为的动画gif:

导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javafx.application.Platform;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.embed.swing.JFXPanel;
导入javafx.scene.scene;
导入javafx.scene.web.WebEngine;
导入javafx.scene.web.WebView;
导入javax.swing.JFrame;
导入javax.swing.SwingUtilities;
公共类WebViewTest扩展了javax.swing.JPanel{
专用静态JFXPanel浏览器FXPanel;
私有网络视图;
私人网络引擎;
/**
*创建新表单WebViewTest
*/
公共WebViewTest(){
初始化组件();
Platform.setImplicitExit(false);
browserFxPanel=新的JFXPanel();
Platform.runLater(新的Runnable(){
公开募捐{
webView=createBrowser();
场景=新场景(webView);
scene.setFill(null);
browserFxPanel.setScene(
场景);
}
});
}
/**
*从构造函数中调用此方法来初始化表单。警告:不要修改此代码
*此方法的内容始终由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
//                           
私有组件(){
java.awt.GridBagConstraints GridBagConstraints;
pnlMain=newjavax.swing.JPanel();
showWebpageButton=newjavax.swing.JButton();
setLayout(新java.awt.GridBagLayout());
pnlMain.setLayout(新java.awt.BorderLayout());
gridBagConstraints=new java.awt.gridBagConstraints();
gridBagConstraints.gridx=0;
gridBagConstraints.gridy=1;
gridBagConstraints.gridwidth=3;
gridBagConstraints.fill=java.awt.gridBagConstraints.BOTH;
gridBagConstraints.weightx=1.0;
gridBagConstraints.weighty=1.0;
添加(pnlMain、gridBagConstraints);
showWebpageButton.setText(“显示网页”);
showWebpageButton.setEnabled(false);
showWebpageButton.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
showWebpageButtonActionPerformed(evt);
}
});
gridBagConstraints=new java.awt.gridBagConstraints();
gridBagConstraints.gridx=1;
gridBagConstraints.gridy=0;
gridBagConstraints.insets=新java.awt.insets(10,10,10,10);
添加(showWebpageButton、gridBagConstraints);
}//                         
私有void showWebpageButtonActionPerformed(java.awt.event.ActionEvent evt){
pnlMain.removeAll();
pnlMain.add(browserFxPanel,BorderLayout.CENTER);
WebViewTest.this.invalidate();
WebViewTest.this.revalidate();
}                                                 
//变量声明-不修改
私有javax.swing.JPanel pnlMain;
私有javax.swing.JButton showWebpageButton;
//变量结束声明
私有WebView createBrowser(){
Double-widthDouble=pnlMain.getSize().getWidth();
Double heightDouble=pnlMain.getSize().getHeight();
最终网络视图=新网络视图();
view.setMinSize(宽度加倍、高度加倍);
view.setPrefSize(宽度加倍、高度加倍);
eng=view.getEngine();
发动机负载(“http://todomvc.com/architecture-examples/angularjs/#/");
eng.getLoadWorker().workDoneProperty().addListener(新的ChangeListener()){
公共无效已更改(ObservalEvalueJFX需要一个“舞台”来展现它的面貌。按以下方式修改您的代码,它将完美工作

/**
 * Creates new form WebViewTest
 */
private Stage stage;                // insert this line
public WebViewTest() {
    initComponents();
    Platform.setImplicitExit(false);
    browserFxPanel = new JFXPanel();
    Platform.runLater(new Runnable() {
        public void run() {
            webView = createBrowser();
            Scene scene = new Scene(webView);
            scene.setFill(null);
            stage = new Stage();         // <<<
            stage.setScene(scene);       // <<<
            browserFxPanel.setScene(scene);
        }
    });
}
...
private void showWebpageButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                  
    pnlMain.removeAll();
    pnlMain.add(browserFxPanel, BorderLayout.CENTER);
    WebViewTest.this.invalidate();
    WebViewTest.this.revalidate();
    stage.show();        // <<< afer click Button
}                                            
/**
*创建新表单WebViewTest
*/
private Stage;//插入此行
公共WebViewTest(){
初始化组件();
Platform.setImplicitExit(false);
browserFxPanel=新的JFXPanel();
Platform.runLater(新的Runnable(){
公开募捐{
webView=createBrowser();
场景=新场景(webView);
scene.setFill(null);

阶段=新阶段();//问题是,如果我在按钮启用时单击该按钮,我无法直接看到加载的网页。起初,我看到一个完全白色的面板,网页只在很短的时间后才可见。我不明白为什么网页不能直接可见。我如何才能实现该网页直接可见?好的,我已经编辑了pos并添加了一个链接到一个动画gif显示的行为。希望它现在更清楚。谢谢你的评论
/**
 * Creates new form WebViewTest
 */
private Stage stage;                // insert this line
public WebViewTest() {
    initComponents();
    Platform.setImplicitExit(false);
    browserFxPanel = new JFXPanel();
    Platform.runLater(new Runnable() {
        public void run() {
            webView = createBrowser();
            Scene scene = new Scene(webView);
            scene.setFill(null);
            stage = new Stage();         // <<<
            stage.setScene(scene);       // <<<
            browserFxPanel.setScene(scene);
        }
    });
}
...
private void showWebpageButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                  
    pnlMain.removeAll();
    pnlMain.add(browserFxPanel, BorderLayout.CENTER);
    WebViewTest.this.invalidate();
    WebViewTest.this.revalidate();
    stage.show();        // <<< afer click Button
}