【问题标题】:How to put webpage into GUI windows in JAVA如何在 JAVA 中将网页放入 GUI 窗口
【发布时间】:2011-01-25 15:27:39
【问题描述】:

我最近用 Java 完成了一个项目,并把它展示给了我的顾问。 项目细节就不用说了,我程序的最终输出就是简单的输出两个网页(一个是谷歌翻译的,另一个是我检索到的中文网页)。

我写的两条语句是:

进程 p=Runtime.getRuntime().exec("cmd /c start http://news.baidu.com/ns?word="+key1+"+"+keyy+"&bt=0&et=0&si=&rn=20&tn=newsA&ie=gb2312&ct=1&cl=2&f=12 ");

进程 r=Runtime.getRuntime().exec("cmd /c start http://translate.google.cn/translate?u=http%3A%2F%2F"+u.substring(7)+"&sl=en&tl=zh-CN&hl=zh-CN&ie=UTF-8");

他们会弹出两个IE窗口来显示网页。

我的顾问对我的结果很满意,但他对输出格式不满意。他希望看到这两个网页显示在 GUI 窗口而不是 IE 窗口中。(最好有一些面板将这两个页面分开图形用户界面)。

我只是突然卡在这一点上,我如何将这两个网页放入 Java 中的 GUI 框架中(在两个单独的文本框或类似的东西中)。

我正在使用 Eclipse IDE。

请提供想法或代码,谢谢。

【问题讨论】:

  • 我不认为使用 IE 或 cmd 是一个愚蠢的想法(一般来说 - 我知道现在你不会;)): - 你喜欢 Windows,它以某种方式破坏了大部分 Java好处 - IE 以各种问题而闻名。在现实生活中,这可能是一个问题,并可能为攻击打开一个窗口(取决于流行程度,无论是广泛的还是被描述的)。

标签: java


【解决方案1】:

您需要一个 Web 浏览器组件来呈现您的 HTML。

请参阅线程here 以获取可能的浏览器组件列表。

您也可以在The DJ Project web page 上看到漂亮的屏幕截图。

【讨论】:

    【解决方案2】:

    这取决于您使用的 GUI 工具包:

    • Swing - 请参阅 ccheneson 答案
    • SWT/JFrame - 它有自己的浏览器组件

    【讨论】:

      【解决方案3】:

      我以前用 QT Webkit 做过类似的事情,而且效果非常好。

      http://qt.nokia.com/doc/qtjambi-4.4/html/com/trolltech/qt/qtjambi-index.html

      如果您想使用此方法访问 HTTPS 站点,但要使其完全正常工作会有些困难。

      【讨论】:

        【解决方案4】:

        JavaFX 是最好的选择。它可以与 Swing 一起工作。

        package com.test.swing.pro;
        
        import java.awt.BorderLayout;
        import java.awt.Dimension;
        import java.awt.FlowLayout;
        import java.awt.Toolkit;
        import java.awt.Window;
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
        import java.net.MalformedURLException;
        import java.net.URISyntaxException;
        import java.net.URL;
        
        import javax.swing.JButton;
        import javax.swing.JFrame;
        import javax.swing.JLabel;
        import javax.swing.JTextField;
        import javax.swing.SwingUtilities;
        
        import javafx.application.Platform;
        import javafx.collections.ObservableList;
        import javafx.embed.swing.JFXPanel;
        import javafx.scene.Scene;
        import javafx.scene.web.WebEngine;
        import javafx.scene.web.WebHistory;
        import javafx.scene.web.WebView;
        
        public class SwingJFxBrower {
            private static WebEngine engine = null;
            static JTextField urlText = null;
        
            private static void initAndShowGUI() {
                // This method is invoked on the EDT thread
                JFrame frame = new JFrame("Swing and JavaFX : Browser");
        
                JButton back = new JButton("<<<<");
                JButton go = new JButton("Go");
                back.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        goBack();
                    }
                });
        
                go.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        loadUrlCustom();
                    }
        
                });
        
                back.setPreferredSize(new Dimension(100, 25));
                go.setPreferredSize(new Dimension(100, 25));
        
                frame.add(back, BorderLayout.NORTH);
        
                JLabel urlLabel = new JLabel("URL: ", JLabel.RIGHT);
                urlText = new JTextField(100);
        
                urlText.setPreferredSize(new Dimension(100, 25));
        
                java.awt.Font font = new java.awt.Font("Courier", java.awt.Font.BOLD, 12);
        
                urlText.setFont(font);
        
                urlLabel.setPreferredSize(new Dimension(100, 25));
        
                frame.add(urlLabel, BorderLayout.WEST);
                frame.add(urlText, BorderLayout.CENTER);
                frame.add(go, BorderLayout.EAST);
        
                final JFXPanel jfxPanel = new JFXPanel();
                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                jfxPanel.setPreferredSize(new Dimension(screenSize.width - 150, screenSize.height - 200));
                frame.add(jfxPanel, BorderLayout.SOUTH);
                frame.setLayout(new FlowLayout());
                Platform.runLater(() -> {
                    WebView webView = new WebView();
                    jfxPanel.setScene(new Scene(webView));
                    engine = webView.getEngine();
                    loadUrl();
                });
        
                frame.setSize(300, 200);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
                frame.pack();
                frame.setSize(screenSize.width - 100, screenSize.height - 150);
                frame.setResizable(false);
                centreWindow(frame);
            }
        
            private static void loadUrl() {
                engine.load("https://duckduckgo.com/");
            }
        
            private static void loadUrlCustom() {
                String url = (urlText.getText());
                boolean validUrl = isValidURL(url);
        
                if (validUrl) {
        
                    urlText.setBackground(java.awt.Color.WHITE);
                    urlText.setForeground(java.awt.Color.BLACK);
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
        
                            engine.load(url);
                        }
                    });
                } else {
                    urlText.setBackground(java.awt.Color.RED);
                    urlText.setForeground(java.awt.Color.WHITE);
                }
        
            }
        
            public static void goBack() {
                try {
                    final WebHistory history = engine.getHistory();
                    Platform.runLater(new Runnable() {
                        public void run() {
                            try {
                                history.go(-1);
                            } catch (Exception ignore) {
        
                            }
                        }
                    });
        
                } catch (Exception ignore) {
        
                }
            }
        
            public static boolean isValidURL(String url) {
        
                URL u = null;
        
                try {
                    u = new URL(url);
                } catch (MalformedURLException e) {
                    return false;
                }
        
                try {
                    u.toURI();
                } catch (URISyntaxException e) {
                    return false;
                }
        
                return true;
            }
        
            public String goForward() {
                final WebHistory history = engine.getHistory();
                ObservableList<WebHistory.Entry> entryList = history.getEntries();
                int currentIndex = history.getCurrentIndex();
        
                Platform.runLater(new Runnable() {
                    public void run() {
                        history.go(1);
                    }
                });
                return entryList.get(currentIndex < entryList.size() - 1 ? currentIndex + 1 : currentIndex).getUrl();
            }
        
            public static void main(String[] args) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        initAndShowGUI();
                    }
                });
            }
        
            public static void centreWindow(Window frame) {
                Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
                int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
                int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
                frame.setLocation(x, y);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-08-02
          • 2016-10-01
          • 2012-01-27
          • 2014-03-21
          • 2020-05-17
          • 2011-06-12
          • 2020-09-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多