【问题标题】:Embed Firefox browser in Java Swing在 Java Swing 中嵌入 Firefox 浏览器
【发布时间】:2011-01-02 12:19:23
【问题描述】:

我想知道是否可以将 Firefox 浏览器作为组件嵌入到基于 Java Swing 的应用程序中。

我从互联网上做了一些研究,但我找不到答案。有人建议使用 Java 中可用的其他浏览器组件。我不认为这更可取,因为渲染引擎与 Firefox 不同。

有什么想法吗?非常感谢。

【问题讨论】:

    标签: java firefox swing


    【解决方案1】:

    我已经完成了,请查看Mozilla Embedding for Java

    这里是一些示例代码

    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.FileNotFoundException; 
    import java.io.File; 
    
    import javax.swing.*;
    
    import org.mozilla.xpcom.*; 
    import org.mozilla.interfaces.*;
    
    /*
    Websites ref
    http://groups.google.com/group/mozilla.dev.tech.java/browse_thread/thread/898ba6751d0c57f7 
    http://skrul.com/blog/code/
    http://wirestorm.net/blog/?cat=9
    
    */
    
    
    public class BrowserTest  implements nsIWebProgressListener,nsIWeakReference, nsIInterfaceRequestor, nsIWebBrowserChrome, nsISHistoryListener{ 
        static {
            try {
                System.loadLibrary("NativeWindow");
            } catch (UnsatisfiedLinkError e) {
                System.err.println("can't find your library");
            }
        }
        private static final String frameTitle="GRE Embedded";
        public static void main(String[] args) {
            BrowserConroller controler=new BrowserConroller();
            controler.run();
            new BrowserTest().start();
        } 
    
        public void start(){
    
    
            JFrame f = new JFrame( frameTitle );
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(400, 150);
            Container content = f.getContentPane();
            content.setBackground(Color.white);
            content.setLayout(new FlowLayout()); 
            content.add(new JLabel("Initializing ... "));
            f.setVisible(true);
    
            File grePath = null; 
            LocationProvider locProvider; 
            Mozilla mozilla = Mozilla.getInstance(); 
    
            GREVersionRange[] range = new GREVersionRange[1]; 
            range[0] = new GREVersionRange("1.8.0", true, "1.9", false); 
    
            try { 
                grePath = Mozilla.getGREPathWithProperties(range, null);
                mozilla.initialize(grePath);
                locProvider = new LocationProvider(grePath); 
                mozilla.initEmbedding(grePath, grePath, locProvider); 
            } 
    
            catch (FileNotFoundException e) { 
                System.out.println("Error: FileNotFoundException"); 
            } 
            catch (XPCOMException e) { 
                System.out.println("Error: XPCOMException"); 
            } 
    
    
            //---------- END GRE INITIALIZATION------------
    
    
            nsIServiceManager serviceManager = mozilla.getServiceManager(); 
    
            nsIAppStartup appStartup = (nsIAppStartup)serviceManager.getServiceByContractID("@mozilla.org/toolkit/app-startup;1", nsIAppStartup.NS_IAPPSTARTUP_IID); 
            nsIWindowCreator windowCreator = (nsIWindowCreator)appStartup.queryInterface(nsIWindowCreator.NS_IWINDOWCREATOR_IID); 
    
            nsIWindowWatcher windowWatcher =(nsIWindowWatcher)serviceManager.getServiceByContractID("@mozilla.org/embedcomp/window-watcher;1",nsIWindowWatcher.NS_IWINDOWWATCHER_IID); 
    
            windowWatcher.setWindowCreator(windowCreator); 
    
            nsIDOMWindow win = windowWatcher.openWindow(null, "http://google.com", "MAIN_WIN","chrome,resizable,centerscreen", null);
            windowWatcher.setActiveWindow( win ); 
    
            nsIComponentManager componentManager = mozilla.getComponentManager();
            String NS_IWEBBROWSER_CID = "F1EAC761-87E9-11d3-AF80-00A024FFC08C"; //$NON-NLS-1$
            nsIWebBrowser webBrowser = (nsIWebBrowser) componentManager.createInstance(NS_IWEBBROWSER_CID, null, nsIWebBrowser.NS_IWEBBROWSER_IID);
            webBrowser.setContainerWindow(this);
            webBrowser.addWebBrowserListener(this, nsIWebProgressListener.NS_IWEBPROGRESSLISTENER_IID);
    
    
    //      nsIWebNavigation webNavigation=(nsIWebNavigation)webBrowser.queryInterface(nsIWebNavigation.NS_IWEBNAVIGATION_IID);
    //      webNavigation.loadURI("http://www.zdnet.com", nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
    //      
    
            nsIBaseWindow baseWindow = (nsIBaseWindow) webBrowser.queryInterface(nsIBaseWindow.NS_IBASEWINDOW_IID);             
            long handle=FindWindow.getHWND( frameTitle );
    
            baseWindow.initWindow(handle, 0, 0, 0,350,350);
            baseWindow.create();
            baseWindow.setVisibility(true);
    
    
    
    
    //      
    //      nsIDOMWindow domWin=webBrowser.getContentDOMWindow();
    //      nsIDOMEventTarget domEventTarget= (nsIDOMEventTarget)domWin.queryInterface(nsIDOMEventTarget.NS_IDOMEVENTTARGET_IID);
    //      domEventTarget.addEventListener("click", new EventListener(), false);
    //      
            //Hide JFrame after it have been initialized
            f.setVisible(true);
    //      
    //      nsIWebNavigation webNavigation=(nsIWebNavigation)webBrowser.queryInterface(nsIWebNavigation.NS_IWEBNAVIGATION_IID);
    //      webNavigation.loadURI("http://www.zdnet.com", nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
    //      
            appStartup.run(); 
            System.out.println("try termEmbedding"); 
            try { 
                System.out.println("mozilla.termEmbedding(); START"); 
                mozilla.termEmbedding(); 
                System.out.println("mozilla.termEmbedding(); FINISHED"); 
            } 
            catch (XPCOMException e) { 
                System.out.println("Fehler: XPCOMException"); 
            } 
            System.out.println("finished termEmbedding"); 
            System.out.println("All done"); 
        }
    
    
    
        public void onLocationChange(nsIWebProgress webProgress, nsIRequest request, nsIURI location) {
            c("onLocationChange");
    
        }
    
        public void onProgressChange(nsIWebProgress webProgress, nsIRequest request, int curSelfProgress, int maxSelfProgress, int curTotalProgress, int maxTotalProgress) {
            c("onProgressChange");
    
        }
    
        public void onSecurityChange(nsIWebProgress webProgress, nsIRequest request, long state) {
            c("onSecurityChange");
    
        }
    
        public void onStateChange(nsIWebProgress webProgress, nsIRequest request, long stateFlags, long status) {
            c("onStateChange");
    
        }
    
        public void onStatusChange(nsIWebProgress webProgress, nsIRequest request, long status, String message) {
            c("onStatusChange");
    
        }
    
        public nsISupports queryInterface(String uuid) {
            c("queryInterface");
            return null;
        }
    
    
    
        public nsISupports queryReferent(String uuid) {
            c("queryReferent");
            return null;
        }
    
        public nsISupports getInterface(String uuid) {
            c("getInterface");
            return null;
        }
        private void c(Object o){
            System.out.println(o);
        }
    
        public void destroyBrowserWindow() {
            c("destroyBrowserWindow");
    
        }
    
        public void exitModalEventLoop(long status) {
            c("exitModalEventLoop");
    
        }
    
        public long getChromeFlags() {
            c("getChromeFlags");
            return 0;
        }
    
        public nsIWebBrowser getWebBrowser() {
            c("getWebBrowser");     
            return null;
        }
    
        public boolean isWindowModal() {
            c("isWindowModal");     
            return false;
        }
    
        public void setChromeFlags(long chromeFlags) {
            c("setChromeFlags");    
    
        }
    
        public void setStatus(long statusType, String status) {
            c("setStatus"); 
    
        }
    
        public void setWebBrowser(nsIWebBrowser webBrowser) {
            c("setWebBrowser");         
        }
    
        public void showAsModal() {
            c("showAsModal");   
    
        }
    
        public void sizeBrowserTo(int acx, int acy) {
            c("sizeBrowserTo"); 
    
        }
    
        public boolean onHistoryGoBack(nsIURI backURI) {
            c("onHistoryGoBack");
            return false;
        }
    
        public boolean onHistoryGoForward(nsIURI forwardURI) {
            c("onHistoryGoForward");
            return false;
        }
    
        public boolean onHistoryGotoIndex(int index, nsIURI gotoURI) {
            c(" onHistoryGotoIndex");
            return false;
        }
    
        public void onHistoryNewEntry(nsIURI newURI) {
            c(" onHistoryNewEntry");
        }
    
        public boolean onHistoryPurge(int numEntries) {
            c(" onHistoryPurge");
            return false;
        }
    
        public boolean onHistoryReload(nsIURI reloadURI, long reloadFlags) {
            c(" onHistoryReload");
            return false;
        }
    
    
    } //public class JavaXPCOM_test1[/code]
    

    【讨论】:

    • 您正在加载库 NativeWindow.dll。这是哪里来的?
    • 这是我创建的自定义库,用于基于comanswer.com/question/…通过 jni 从 java 中查找 Native Handle
    • 是否有任何 maven 存储库用于 mozilla 依赖项?
    • 代码有错误你能给我所有库的完整代码吗...谢谢
    • 主浏览器控制器是什么???它在哪里减速?以及在哪里可以找到 NativeWindow.dll
    【解决方案2】:

    正如here (Best Java/Swing browser component?) 的回答——根据我自己的测试——djproject 似乎是最好的。

    它最后一次更新是在 2009 年 3 月,一些演示链接已损坏。所以该项目现在似乎不太活跃。不过:当我在 2010 年需要它时,它很棒。

    【讨论】:

    【解决方案3】:

    快速的 Google 搜索会返回一个名为 JxBrowser 的产品。

    但是,我会质疑您的应用程序中是否真的需要一个完整的浏览器组件,例如 Firefox。您在应用程序中需要它做什么?

    【讨论】:

    • jxbrowser 是商业的。使用这些库需要约 1500 美元。
    【解决方案4】:

    使用小程序、GWT 或其他富客户端方法将您的 GUI 嵌入到浏览器中怎么样?

    【讨论】:

      【解决方案5】:

      不直接。您可以将您的 UI(或至少一部分)移植到 SWT,然后使用浏览器组件(请参阅this FAQ item)。

      如果您无法将 UI 移植到 SWT,那么您可以将 Swing UI 嵌入 SWT (SWT Shell == Swing JFrame)。但是前面会有一些痛苦。

      更新: SWT 不再支持 Firefox。目前支持的是系统的默认浏览器或WebKit(见https://github.com/eclipse/eclipse.platform.swt/search?q=BrowserFactory&unscoped_q=BrowserFactory)。

      【讨论】:

      猜你喜欢
      • 2014-09-07
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2012-02-07
      • 2010-09-22
      • 2014-07-05
      • 2014-02-08
      • 2021-02-28
      相关资源
      最近更新 更多