2011-12-04 11 views
32

Webブラウザコンポーネントを既存のSwingアプリケーションに統合する方法を探していて、Java FX 2.0用にWebViewが見つかりました。さらに、java.netのブログ記事でhow to integrate a Java FX component into a Swing Applicationが見つかりました。だから私はそれが可能かもしれないと思うが、私はまだ試していない。JavaFX 2.0 WebViewをSwing Java SE 6アプリケーションに統合

私は不思議です、これは良いアプローチだと思いますか?もっと良い解決策はありますか?それは可能ですか?多分何か事前に梱包されていますか?

動機は次のとおりです。は、私は、既存のスイングアプリケーション、ウェブでそれを置き換える、全く全体のJavaデスクトップアプリケーションを取り除くためにされて長期的な目標にいくつかのWebBrowser- どんなを統合したいです(既存のアスペクトをゆっくりとWebページに変換し、ブラウザのスケルトンを除いてスイングアプリケーションが何も残らない限り、WebBrowserコンポーネントに表示されます)。バックエンドはもちろんJavaのままです:-)

JavaFXを自分のプロジェクトに組み込む時間が不足しているので、私はまだ試していません(その仕事は、長期的には代替案を探っています)。私が燃えてしまう前によく聞いてください。

+0

1あまりにも大変な仕事、 – mKorbel

答えて

18

非常に可能です!

JavaFX 2.0をインストールする必要があり、何とかクラスパスにjfxrt.jarを持つことができます。

次のコードは、JFXPanelをJFrame内にレンダリングします。 JFXPanelには、google.comをロードするWebViewが含まれています。

しかし、少なくとも私のマシンでは、WebViewはむしろお粗末です。私はMac OS X 10.6で作業しています。 JavaFX 2.0はまだOS Xのベータ版です。MozSwingが見つかりました。これは非常に有望で、かなり速いと感じました。残念ながら、このプロジェクトは2008年以来開発されておらず、バンドルされたXULランナーはかなり古くなっています(新しいファンキーなHTML 5はありません)。

どちらの方法も、via mavenを含む悪夢です。自分のローカルリポジトリをセットアップする方がよいでしょう。

import java.awt.Dimension; 
import java.awt.Point; 

import javafx.application.Platform; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class JavaFX { 

    /* Create a JFrame with a JButton and a JFXPanel containing the WebView. */ 
    private static void initAndShowGUI() { 
     // This method is invoked on Swing thread 
     JFrame frame = new JFrame("FX"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.getContentPane().setLayout(null); // do the layout manually 

     final JButton jButton = new JButton("Button"); 
     final JFXPanel fxPanel = new JFXPanel(); 

     frame.add(jButton); 
     frame.add(fxPanel); 
     frame.setVisible(true); 

     jButton.setSize(new Dimension(200, 27)); 
     fxPanel.setSize(new Dimension(300, 300)); 
     fxPanel.setLocation(new Point(0, 27)); 

     frame.getContentPane().setPreferredSize(new Dimension(300, 327)); 
     frame.pack(); 
     frame.setResizable(false); 

     Platform.runLater(new Runnable() { // this will run initFX as JavaFX-Thread 
      @Override 
      public void run() { 
       initFX(fxPanel); 
      } 
     }); 
    } 

    /* Creates a WebView and fires up google.com */ 
    private static void initFX(final JFXPanel fxPanel) { 
     Group group = new Group(); 
     Scene scene = new Scene(group); 
     fxPanel.setScene(scene); 

     WebView webView = new WebView(); 

     group.getChildren().add(webView); 
     webView.setMinSize(300, 300); 
     webView.setMaxSize(300, 300); 

      // Obtain the webEngine to navigate 
     WebEngine webEngine = webView.getEngine(); 
     webEngine.load("http://www.google.com/"); 
    } 

    /* Start application */ 
    public static void main(final String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       initAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

これは私のために正常に動作しますが、それは非常に遅いです。 (私のjqueryアプリケーションのシステムブラウザよりも10〜100倍遅い)。どんな考え?それはJavaFXですか、それともあなたの使い方ですか? – Daniel

+0

私はそれがJavaFXだと信じています。私が言及したように、私のマシンではそれも遅いですが、これはおそらくOS X上でまだベータ版であるという事実によると思いました。 – scravy

+0

Win7x64とWinXPで同じ問題が発生しましたFYI – Daniel

3

あなたはクロムエンジンに基づいた軽量Webブラウザをスイング埋め込む必要がある場合は、JxBrowserライブラリを見てみることができます。次のコードは、JFrameのにブラウザコンポーネントを組み込むと、いくつかのWebページをロードする方法を示しています。

import com.teamdev.jxbrowser.chromium.Browser; 
import com.teamdev.jxbrowser.chromium.swing.BrowserView; 

import javax.swing.*; 
import java.awt.*; 

/** 
* This sample demonstrates how to create Browser instance, 
* embed it into Swing BrowserView container, display it in JFrame and 
* navigate to the "www.google.com" web site. 
*/ 
public class BrowserSample { 
    public static void main(String[] args) { 
     Browser browser = new Browser(); 
     BrowserView browserView = new BrowserView(browser); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.add(browserView, BorderLayout.CENTER); 
     frame.setSize(700, 500); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     browser.loadURL("http://www.google.com"); 
    } 
} 

Webページはクロムエンジンによってレンダリングされます。

これは、オープンソースプロジェクトのための無料です。バナナとリンゴを混合)

+0

ヒントのためにありがとう! –

+1

もう無料ではありません... –

+0

[評価](https://www.teamdev.com/jxbrowser#evaluate)Webフォームを使用して、無料のオープンソースライセンスをリクエストしてください。 – Vladimir

関連する問題