2010-01-07 338 views
10

我想知道是否可以將Firefox瀏覽器作爲組件嵌入到基於Java Swing的應用程序中。在Java Swing中嵌入Firefox瀏覽器

我已經從網上做了一些研究,但是我找不到答案。有人建議使用Java中可用的其他瀏覽器組件。我不認爲這是可取的,因爲渲染引擎與Firefox不同。

有什麼想法?非常感謝。

回答

15

絕對是我做之前,請檢查出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] 
+0

對不起格式 – Greg 2010-01-07 15:25:48

+0

謝謝。我還發現了MozSwing,看起來非常好。 – Mountain 2010-01-07 15:27:30

+0

您正在加載庫,NativeWindow.dll。這是從哪裏來的? – 2010-12-12 14:57:38

0

不是直接。您可以將您的UI(或至少部分)移植到SWT,然後使用瀏覽器組件(請參閱this FAQ item)。

如果您不能端口的用戶界面,SWT,那麼你可以嵌入在SWT(SWT Shell ==搖擺JFrame)你的揮杆UI。但是前方會有一些痛苦。

0

快速谷歌搜索返回一個產品JxBrowser這樣做。

但是,我會質疑你是否真的需要一個完整的瀏覽器組件如Firefox在你的應用程序。你的應用程序需要什麼?

+2

很貴... – lvr123 2016-01-10 21:03:57

+0

jxbrowser是商業。您需要約1500美元才能使用這些庫。 – 2016-11-08 03:59:18

1

如何將GUI嵌入瀏覽器而不是使用applet,GWT或其他富客戶端方法?

2

由於aswered here (Best Java/Swing browser component?) - 從我自己的測試 - djproject似乎是最好的。

它最近一次更新於2009年3月,一些演示鏈接被打破了..所以這個項目似乎不會太活躍。不過:當我2年前需要它時,它真棒。