zoukankan      html  css  js  c++  java
  • Java-Swing嵌入浏览器(一)

    今天要说的额是浏览器的第一个版本是用DJnative-swt和swt包开发的调用本地浏览器和webkit浏览器的示例

    这是我的工程目录【源码见最后】:

    image

    src下为写的源码,lib为引入的swt和DJnative和mozilla接口包~

    我们来看两个类,此两个类是嵌入webkiet mozilla的内核浏览器 要用到xulrunner

    这里有一句代码 就是下面这句

    //指定xulRunner路径 如不指定就调用系统注册的xulrunner 注册为 xulRunner目录下的xulrunner --register-global
            NSSystemPropertySWT.WEBBROWSER_XULRUNNER_HOME.set(System.getProperty("user.dir") + "/xulrunner");

    如果没有写这句代码引入工程下的xulrunner,那么就必须要进行注册注册为xulrunner --register-global 卸载为 xulrunner --unregister-global

    XPCOMDownloadManager.java 类 调用mozilla内核浏览器

    /*
     * luwenbin006@163.com (luwenbin006@163.com)
     * http://www.luwenbin.com
     *
     * See the file "readme.txt" for information on usage and redistribution of
     * this file, and for a DISCLAIMER OF ALL WARRANTIES.
     */
    package com.luwenbin.webbrowser;
    
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    import org.mozilla.interfaces.nsICancelable;
    import org.mozilla.interfaces.nsIComponentRegistrar;
    import org.mozilla.interfaces.nsIFactory;
    import org.mozilla.interfaces.nsILocalFile;
    import org.mozilla.interfaces.nsIMIMEInfo;
    import org.mozilla.interfaces.nsIRequest;
    import org.mozilla.interfaces.nsISupports;
    import org.mozilla.interfaces.nsITransfer;
    import org.mozilla.interfaces.nsIURI;
    import org.mozilla.interfaces.nsIWebProgress;
    import org.mozilla.interfaces.nsIWebProgressListener;
    import org.mozilla.xpcom.Mozilla;
    
    import chrriis.common.UIUtils;
    import chrriis.dj.nativeswing.swtimpl.NSSystemPropertySWT;
    import chrriis.dj.nativeswing.swtimpl.NativeInterface;
    import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
    import chrriis.dj.nativeswing.swtimpl.components.MozillaXPCOM;
    
    /**
     * @author luwenbin006@163.com
     */
    public class XPCOMDownloadManager
    {
    
        public static JComponent createContent()
        {
            JPanel contentPane = new JPanel(new BorderLayout());
            JPanel webBrowserPanel = new JPanel(new BorderLayout());
            webBrowserPanel.setBorder(BorderFactory.createTitledBorder("Native Web Browser component"));
            //指定xulRunner路径 如不指定就调用系统注册的xulrunner 注册为 xulRunner目录下的xulrunner --register-global
            NSSystemPropertySWT.WEBBROWSER_XULRUNNER_HOME.set(System.getProperty("user.dir") + "/xulrunner");
    
            final JWebBrowser webBrowser = new JWebBrowser(JWebBrowser.useXULRunnerRuntime());
            webBrowser.navigate("http://www.eclipse.org/downloads");
            webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
            contentPane.add(webBrowserPanel, BorderLayout.CENTER);
            // Create an additional area to see the downloads in progress.
            final JPanel downloadsPanel = new JPanel(new GridLayout(0, 1));
            downloadsPanel.setBorder(BorderFactory.createTitledBorder("Download manager (on-going downloads are automatically added to this area)"));
            contentPane.add(downloadsPanel, BorderLayout.SOUTH);
            // We can only access XPCOM when it is properly initialized.
            // This happens when the web browser is created so we run our code in sequence.
            webBrowser.runInSequence(new Runnable()
            {
                public void run()
                {
                    try
                    {
                        nsIComponentRegistrar registrar = MozillaXPCOM.Mozilla.getComponentRegistrar();
                        String NS_DOWNLOAD_CID = "e3fa9D0a-1dd1-11b2-bdef-8c720b597445";
                        String NS_TRANSFER_CONTRACTID = "@mozilla.org/transfer;1";
                        registrar.registerFactory(NS_DOWNLOAD_CID, "Transfer", NS_TRANSFER_CONTRACTID, new nsIFactory()
                        {
                            public nsISupports queryInterface(String uuid)
                            {
                                if(uuid.equals(nsIFactory.NS_IFACTORY_IID) || uuid.equals(nsIFactory.NS_ISUPPORTS_IID))
                                {
                                    return this;
                                }
                                return null;
                            }
                            public nsISupports createInstance(nsISupports outer, String iid)
                            {
                                return createTransfer(downloadsPanel);
                            }
                            public void lockFactory(boolean lock) {}
                        });
                    }
                    catch(Exception e)
                    {
                        JOptionPane.showMessageDialog(webBrowser, "Failed to register XPCOM download manager.
    Please check your XULRunner configuration.", "XPCOM interface", JOptionPane.ERROR_MESSAGE);
                        return;
                    }
                }
            });
            return contentPane;
        }
    
        private static nsITransfer createTransfer(final JPanel downloadsPanel)
        {
            return new nsITransfer()
            {
                public nsISupports queryInterface(String uuid)
                {
                    if(uuid.equals(nsITransfer.NS_ITRANSFER_IID) ||
                            uuid.equals(nsITransfer.NS_IWEBPROGRESSLISTENER2_IID) ||
                            uuid.equals(nsITransfer.NS_IWEBPROGRESSLISTENER_IID) ||
                            uuid.equals(nsITransfer.NS_ISUPPORTS_IID))
                    {
                        return this;
                    }
                    return null;
                }
                private JComponent downloadComponent;
                private JLabel downloadStatusLabel;
                private String baseText;
                public void init(nsIURI source, nsIURI target, String displayName, nsIMIMEInfo MIMEInfo, double startTime, nsILocalFile tempFile, final nsICancelable cancelable)
                {
                    downloadComponent = new JPanel(new BorderLayout(5, 5));
                    downloadComponent.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 5));
                    JButton cancelDownloadButton = new JButton("Cancel");
                    downloadComponent.add(cancelDownloadButton, BorderLayout.WEST);
                    final String path = target.getPath();
                    cancelDownloadButton.addActionListener(new ActionListener()
                    {
                        public void actionPerformed(ActionEvent e)
                        {
                            cancelable.cancel(Mozilla.NS_ERROR_ABORT);
                            removeDownloadComponent();
                            new File(path + ".part").delete();
                        }
                    });
                    baseText = "Downloading to " + path;
                    downloadStatusLabel = new JLabel(baseText);
                    downloadComponent.add(downloadStatusLabel, BorderLayout.CENTER);
                    downloadsPanel.add(downloadComponent);
                    downloadsPanel.revalidate();
                    downloadsPanel.repaint();
                }
                public void onStateChange(nsIWebProgress webProgress, nsIRequest request, long stateFlags, long status)
                {
                    if((stateFlags & nsIWebProgressListener.STATE_STOP) != 0)
                    {
                        removeDownloadComponent();
                    }
                }
                private void removeDownloadComponent()
                {
                    downloadsPanel.remove(downloadComponent);
                    downloadsPanel.revalidate();
                    downloadsPanel.repaint();
                }
                public void onProgressChange64(nsIWebProgress webProgress, nsIRequest request, long curSelfProgress, long maxSelfProgress, long curTotalProgress, long maxTotalProgress)
                {
                    long currentKBytes = curTotalProgress / 1024;
                    long totalKBytes = maxTotalProgress / 1024;
                    downloadStatusLabel.setText(baseText + " (" + currentKBytes + "/" + totalKBytes + ")");
                }
                public void onStatusChange(nsIWebProgress webProgress, nsIRequest request, long status, String message) {}
                public void onSecurityChange(nsIWebProgress webProgress, nsIRequest request, long state) {}
                public void onProgressChange(nsIWebProgress webProgress, nsIRequest request, int curSelfProgress, int maxSelfProgress, int curTotalProgress, int maxTotalProgress) {}
                public void onLocationChange(nsIWebProgress webProgress, nsIRequest request, nsIURI location) {}
            };
        }
    
        /* Standard main method to try that test as a standalone application. */
        public static void main(String[] args)
        {
            NativeInterface.open();
            UIUtils.setPreferredLookAndFeel();
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    JFrame frame = new JFrame("DJ Native Swing Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.getContentPane().add(createContent(), BorderLayout.CENTER);
                    frame.setSize(800, 600);
                    frame.setLocationByPlatform(true);
                    frame.setVisible(true);
                }
            });
            NativeInterface.runEventPump();
        }
    
    }

    下面是运行效果:

    image

    XPCOMToggleEditionModer.java 类 调用mozilla内核浏览器 并启用编辑模式

    /*
     * luwenbin006@163.com (luwenbin006@163.com)
     * http://www.luwenbin.com
     *
     * See the file "readme.txt" for information on usage and redistribution of
     * this file, and for a DISCLAIMER OF ALL WARRANTIES.
     */
    package com.luwenbin.webbrowser;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    
    import javax.swing.BorderFactory;
    import javax.swing.JCheckBox;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    import org.mozilla.interfaces.nsIDOMDocument;
    import org.mozilla.interfaces.nsIDOMNSHTMLDocument;
    import org.mozilla.interfaces.nsIDOMWindow;
    import org.mozilla.interfaces.nsIWebBrowser;
    
    import chrriis.common.UIUtils;
    import chrriis.dj.nativeswing.swtimpl.NSSystemPropertySWT;
    import chrriis.dj.nativeswing.swtimpl.NativeInterface;
    import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
    import chrriis.dj.nativeswing.swtimpl.components.MozillaXPCOM;
    
    /**
     * @author luwenbin006@163.com
     */
    public class XPCOMToggleEditionMode
    {
    
        public static JComponent createContent()
        {
            JPanel contentPane = new JPanel(new BorderLayout());
            JPanel webBrowserPanel = new JPanel(new BorderLayout());
            webBrowserPanel.setBorder(BorderFactory.createTitledBorder("Native Web Browser component"));
            //指定xulRunner路径 如不指定就调用系统注册的xulrunner 注册为 xulRunner目录下的xulrunner --register-global
            NSSystemPropertySWT.WEBBROWSER_XULRUNNER_HOME.set(System.getProperty("user.dir") + "/xulrunner");
    
            final JWebBrowser webBrowser = new JWebBrowser(JWebBrowser.useXULRunnerRuntime());
            webBrowser.navigate("http://www.google.com");
            webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
            contentPane.add(webBrowserPanel, BorderLayout.CENTER);
            // Create an additional bar allowing to toggle the edition mode of the web browser.
            JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4));
            JCheckBox designModeCheckBox = new JCheckBox("Edition Mode (allows to type text or resize elements directly in the page)");
            designModeCheckBox.addItemListener(new ItemListener()
            {
                public void itemStateChanged(ItemEvent e)
                {
                    nsIWebBrowser iWebBrowser = MozillaXPCOM.getWebBrowser(webBrowser);
                    if(iWebBrowser == null)
                    {
                        JOptionPane.showMessageDialog(webBrowser, "The XPCOM nsIWebBrowser interface could not be obtained.
    Please check your XULRunner configuration.", "XPCOM interface", JOptionPane.ERROR_MESSAGE);
                        return;
                    }
                    nsIDOMWindow window = iWebBrowser.getContentDOMWindow();
                    nsIDOMDocument document = window.getDocument();
                    nsIDOMNSHTMLDocument nsDocument = (nsIDOMNSHTMLDocument)document.queryInterface(nsIDOMNSHTMLDocument.NS_IDOMNSHTMLDOCUMENT_IID);
                    nsDocument.setDesignMode(e.getStateChange() == ItemEvent.SELECTED ? "on" : "off");
                }
            });
            buttonPanel.add(designModeCheckBox);
            contentPane.add(buttonPanel, BorderLayout.SOUTH);
            return contentPane;
        }
    
        /* Standard main method to try that test as a standalone application. */
        public static void main(String[] args)
        {
            NativeInterface.open();
            UIUtils.setPreferredLookAndFeel();
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    JFrame frame = new JFrame("DJ Native Swing Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.getContentPane().add(createContent(), BorderLayout.CENTER);
                    frame.setSize(800, 600);
                    frame.setLocationByPlatform(true);
                    frame.setVisible(true);
                }
            });
            NativeInterface.runEventPump();
        }
    
    }

    下面是运行效果:

    image

    SimpleWebBrowserExample.java 调用本机默认浏览器

    /*
     * luwenbin006@163.com (luwenbin006@163.com)
     * http://www.luwenbin.com
     *
     * See the file "readme.txt" for information on usage and redistribution of
     * this file, and for a DISCLAIMER OF ALL WARRANTIES.
     */
    package com.luwenbin.webbrowser;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    
    import javax.swing.BorderFactory;
    import javax.swing.JCheckBox;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    import chrriis.common.UIUtils;
    import chrriis.dj.nativeswing.swtimpl.NativeInterface;
    import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
    
    /**
     * @author luwenbin006@163.com
     */
    public class SimpleWebBrowserExample
    {
    
        public static JComponent createContent()
        {
            JPanel contentPane = new JPanel(new BorderLayout());
            JPanel webBrowserPanel = new JPanel(new BorderLayout());
            webBrowserPanel.setBorder(BorderFactory.createTitledBorder("Native Web Browser component"));
            final JWebBrowser webBrowser = new JWebBrowser();
            webBrowser.navigate("http://www.google.com");
            webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
            contentPane.add(webBrowserPanel, BorderLayout.CENTER);
            // Create an additional bar allowing to show/hide the menu bar of the web browser.
            JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4));
            JCheckBox menuBarCheckBox = new JCheckBox("Menu Bar", webBrowser.isMenuBarVisible());
            menuBarCheckBox.addItemListener(new ItemListener()
            {
                public void itemStateChanged(ItemEvent e)
                {
                    webBrowser.setMenuBarVisible(e.getStateChange() == ItemEvent.SELECTED);
                }
            });
            buttonPanel.add(menuBarCheckBox);
            contentPane.add(buttonPanel, BorderLayout.SOUTH);
            return contentPane;
        }
    
        /* Standard main method to try that test as a standalone application. */
        public static void main(String[] args)
        {
            NativeInterface.open();
            UIUtils.setPreferredLookAndFeel();
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    JFrame frame = new JFrame("DJ Native Swing Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.getContentPane().add(createContent(), BorderLayout.CENTER);
                    frame.setSize(800, 600);
                    frame.setLocationByPlatform(true);
                    frame.setVisible(true);
                }
            });
            NativeInterface.runEventPump();
        }
    
    }

    下面是运行效果:

    image

    放出源码下载地址【鄙视伸手党】:http://pan.baidu.com/s/1mgmjgso

  • 相关阅读:
    如何设置body高度为浏览器高度
    h5的video下载按钮如何隐藏
    微信小程序中的子父组件传值问题
    elementUI级联选择器2(选择及回显)编辑保存
    elementUI级联选择器(选择及回显)
    vue+elementUI 表格操作行的增删改查
    单独验证非form表单中的input(限制)
    JS中去除数组中的假值(0, 空,undefined, null, false)
    vue 组件之间的传值 (父子传值、兄弟传值)
    http协议的状态码
  • 原文地址:https://www.cnblogs.com/luwenbin/p/4125028.html
Copyright © 2011-2022 走看看