0

我在 javafxapplication 的帮助下设计了一个 WebView 页面。现在我想在 java jframe 表单上添加这个 webview 来创建 webview 我使用下面的代码

package timetrimnew;

import java.util.List;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import java.io.*;

public class WebView1 extends Application {
    String htmlpath = "d:/lcrux/html/";@Override public void start(Stage primaryStage) throws Exception {
        Pane root = new WebViewPane();
        primaryStage.setScene(new Scene(root, 500, 500));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    public class WebViewPane extends Pane {

        public WebViewPane() {
            // VBox.setVgrow(this, Priority.ALWAYS);
            // setMaxWidth(Double.MAX_VALUE);
            // setMaxHeight(Double.MAX_VALUE);

            WebView view = new WebView();
            view.setMinSize(500, 400);
            view.setPrefSize(500, 400);
            final WebEngine eng = view.getEngine();
            File htmlFile = new File(htmlpath + "pi/welcome.htm");
            try {
                eng.load(htmlFile.toURI().toURL().toString());
            } catch (Exception ex) {

            }

            GridPane grid = new GridPane();
            grid.setVgap(5);
            grid.setHgap(5);

            GridPane.setConstraints(view, 0, 1, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS);
            grid.getColumnConstraints().addAll(
            new ColumnConstraints(100, 100, Double.MAX_VALUE, Priority.ALWAYS, HPos.CENTER, true),
            new ColumnConstraints(40, 40, 40, Priority.NEVER, HPos.CENTER, true));
            grid.getChildren().addAll(view);
            getChildren().add(grid);
        }

        @Override protected void layoutChildren() {
            List < Node > managed = getManagedChildren();
            double width = getWidth();
            double height = getHeight();
            double top = getInsets().getTop();
            double right = getInsets().getRight();
            double left = getInsets().getLeft();
            double bottom = getInsets().getBottom();
            for (int i = 0; i < managed.size(); i++) {
                Node child = managed.get(i);
                layoutInArea(child, left, top,
                width - left - right, height - top - bottom,
                0, Insets.EMPTY, true, true, HPos.CENTER, VPos.CENTER);
            }
        }
    }
}
4

2 回答 2

1

我必须做同样的事情,这是我的实现。我需要在 JTabbed 窗格(或任何其他 JPanel,没关系)上显示 WebView,并且我还使用了 GridPane 示例。当您指定 JFrame 时,我不会包含 JTabbed 窗格的代码

如果您需要在 JFrame 中显示它,请使用以下类:

            package testproject;

            import javafx.application.Platform;
            import javafx.beans.value.ChangeListener;
            import javafx.beans.value.ObservableValue;
            import javafx.embed.swing.JFXPanel;
            import javafx.event.EventHandler;
            import javafx.scene.Scene;
            import javafx.scene.web.WebEngine;
            import javafx.scene.web.WebEvent;
            import javafx.scene.web.WebView;

            import javax.swing.*;
            import java.awt.*;
            import java.awt.event.*;
            import java.net.MalformedURLException;
            import java.net.URL;

            import static javafx.concurrent.Worker.State.FAILED;
            import javafx.scene.web.PopupFeatures;
            import javafx.util.Callback;

            /**
             *
             * @author id011593
             */
            public class MyWebBrowser implements Runnable {

                private JFXPanel jfxPanel;
                private WebEngine engine;
                private JFrame frame = new JFrame();
                private JPanel panel = new JPanel(new BorderLayout());
                private JLabel lblStatus = new JLabel();
                private JButton btnGo = new JButton("Go");
                private JTextField txtURL = new JTextField();
                private JProgressBar progressBar = new JProgressBar();

                private void initComponents() {

                    jfxPanel = new JFXPanel();
                    createScene();

                    ActionListener al = new ActionListener() {
                        @Override public void actionPerformed(ActionEvent e) {
                            loadURL(txtURL.getText());
                        }
                    };

                    btnGo.addActionListener(al);
                    txtURL.addActionListener(al);

                    progressBar.setPreferredSize(new Dimension(150, 18));
                    progressBar.setStringPainted(true);

                    JPanel topBar = new JPanel(new BorderLayout(5, 0));
                    topBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
                    topBar.add(txtURL, BorderLayout.CENTER);
                    topBar.add(btnGo, BorderLayout.EAST);


                    JPanel statusBar = new JPanel(new BorderLayout(5, 0));
                    statusBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
                    statusBar.add(lblStatus, BorderLayout.CENTER);
                    statusBar.add(progressBar, BorderLayout.EAST);

                    panel.add(topBar, BorderLayout.NORTH);
                    panel.add(jfxPanel, BorderLayout.CENTER);
                    panel.add(statusBar, BorderLayout.SOUTH);

                    frame.getContentPane().add(panel);
                }

                private void createScene() {

                    Platform.runLater(new Runnable() {
                        @Override public void run() {

                            final WebView webviewMain = new WebView();
                            //final MyWebBrowser newWin = new MyWebBrowser();
                            engine = webviewMain.getEngine();

            //                engine.setCreatePopupHandler(new Callback<PopupFeatures, WebEngine>() {
            //                    @Override
            //                    public WebEngine call(PopupFeatures config) {
            //
            //                        newWin.run();
            //                        return newWin.getEngine();
            //                    }
            //                });

                            engine.titleProperty().addListener(new ChangeListener<String>() {
                                @Override
                                public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue) {
                                    SwingUtilities.invokeLater(new Runnable() {
                                        @Override public void run() {
                                            frame.setTitle(newValue);
                                        }
                                    });
                                }
                            });

                            engine.setOnStatusChanged(new EventHandler<WebEvent<String>>() {
                                @Override public void handle(final WebEvent<String> event) {
                                    SwingUtilities.invokeLater(new Runnable() {
                                        @Override public void run() {
                                            lblStatus.setText(event.getData());
                                        }
                                    });
                                }
                            });

                            engine.locationProperty().addListener(new ChangeListener<String>() {
                                @Override
                                public void changed(ObservableValue<? extends String> ov, String oldValue, final String newValue) {
                                    SwingUtilities.invokeLater(new Runnable() {
                                        @Override public void run() {
                                            txtURL.setText(newValue);
                                        }
                                    });
                                }
                            });

                            engine.getLoadWorker().workDoneProperty().addListener(new ChangeListener<Number>() {
                                @Override
                                public void changed(ObservableValue<? extends Number> observableValue, Number oldValue, final Number newValue) {
                                    SwingUtilities.invokeLater(new Runnable() {
                                        @Override public void run() {
                                            progressBar.setValue(newValue.intValue());
                                        }
                                    });
                                }
                            });

                            engine.getLoadWorker()
                                    .exceptionProperty()
                                    .addListener(new ChangeListener<Throwable>() {

                                        public void changed(ObservableValue<? extends Throwable> o, Throwable old, final Throwable value) {
                                            if (engine.getLoadWorker().getState() == FAILED) {
                                                SwingUtilities.invokeLater(new Runnable() {
                                                    @Override public void run() {
                                                        JOptionPane.showMessageDialog(
                                                                panel,
                                                                (value != null) ?
                                                                engine.getLocation() + "\n" + value.getMessage() :
                                                                engine.getLocation() + "\nUnexpected error.",
                                                                "Loading error...",
                                                                JOptionPane.ERROR_MESSAGE);
                                                    }
                                                });
                                            }
                                        }
                                    });

                            jfxPanel.setScene(new Scene(webviewMain));
                        }
                    });
                }

                public void loadURL(final String url) {
                    Platform.runLater(new Runnable() {
                        @Override public void run() {
                            String tmp = toURL(url);

                            if (tmp == null) {
                                tmp = toURL("http://" + url);
                            }

                            engine.load(tmp);
                        }
                    });
                }

                private static String toURL(String str) {
                    try {
                        return new URL(str).toExternalForm();
                    } catch (MalformedURLException exception) {
                            return null;
                    }
                }

                @Override public void run() {

                    frame.setPreferredSize(new Dimension(1024, 800));
                    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                    initComponents();

                    loadURL("http://www.bbc.co.uk/news");

                    frame.pack();
                    frame.setVisible(true);
                }

                public WebEngine getEngine() {
                    return engine;
                }

                public void setEngine(WebEngine engine) {
                    this.engine = engine;
                }

                public JFXPanel getJfxPanel() {
                    return jfxPanel;
                }

                public void setJfxPanel(JFXPanel jfxPanel) {
                    this.jfxPanel = jfxPanel;
                }

            }

如果您不想处理弹出窗口,请在处理程序中评论该部分。希望能帮助到你。JFXPanel 也可以工作,但我在调整 JPanel 大小时遇到​​了很多问题。GridPane 没有这个,但我是 Java 新手,对 FavaFX 也很陌生,所以它可能是飞行员错误:) 祝你好运....

为文本框中格式错误的代码道歉,我知道这会惹恼一些人,但这是一个快速复制粘贴,我必须开始工作!

于 2013-05-14T22:11:15.650 回答
1

我认为您正在寻找的是JFXPanel课程(http://docs.oracle.com/javafx/2/api/javafx/embed/swing/JFXPanel.html)。它是一个可以嵌入JavaFX 场景的swing 组件。不是使用舞台来显示场景,而是使用将其添加到 JFXPanel 实例

Platform.runLater(new Runnable() {
    public void run() {
        myFXPanel.setScene(myWebView);
    }
});

您需要该Platform.runLater(...)部分,因为 JFXPanel#setScene 必须在 JavaFX 应用程序线程上调用,而 UI 的其余部分将在 Swing 事件队列上运行。

于 2012-11-22T11:38:18.240 回答