2011-12-04 20 views
32

Bir Web-Browser-Component'in mevcut Swing-Application ile entegre edilmesinin bir yolunu aradım ve Java FX 2.0 için WebView'u buldum. Ayrıca java.net üzerinde how to integrate a Java FX component into a Swing Application'u gösteren bir blog yazısı buldum. Bu yüzden yapılabilir olabilir, ama henüz denemedim.JavaFX 2.0 WebView'in Swing Java SE ile Entegre Edilmesi SE 6 Uygulaması

Merak ediyorum, bunun iyi bir yaklaşım olduğunu mu düşünüyorsunuz? Daha iyi çözümler var mı? Hatta yapılabilir mi? Dışarıda önceden bir şeyler var mı?

motivasyon geçerli: Mevcut bir Salıncak-Uygulama, bir web ile değiştirilmesi, hiç bütün Java Masaüstü Uygulaması kurtulmak için olmak uzun vadeli hedefi haline bazı WebBrowser- ne olursa olsun entegre etmek istiyorum temelli çözüm (plan, tarayıcı-iskelet hariç, salıncak uygulamasından hiçbir şey kalmayıncaya kadar WebBrowser-Bileşeninde görüntülenen web sayfalarına yavaşça dönüştürebilir). Tabii ki arka uç Java kalır

Henüz denemedim çünkü JavaFX'i projeme entegre etme zamanım yok (bu bir iş, sadece uzun vadede alternatifler arıyoruz), Yakılmadan önce sor.

+0

1 çok zor bir iş karıştırma elma, – mKorbel

cevap

18

Bu çok iyi bir şeydir!

Birisi JavaFX 2.0'u yüklemeli ve bir şekilde Classpath'da jfxrt.jar ürününü bulundurmayı başarmıştır.

Aşağıdaki kod bir JFrame içinde JFXPanel oluşturur. JFXPanel, google.com yükleyen bir WebView içerir.

Ancak, en azından makinemde, WebView oldukça gevşek görünüyor. Mac OS X 10.6 üzerinde çalışıyorum; JavaFX 2.0 OS X

Alternatifler Ben çok umut verici görünüyordu ve oldukça hızlı aslında hissediyor MozSwing dahil bulundu için hala beta. Ne yazık ki, proje 2008'den beri geliştirilmiyor ve paketlenmiş XUL koşucusu oldukça eski (yeni bir fantezi html 5 değil).

Her iki yaklaşım da maven aracılığıyla bir kabus içerisindedir, kendi yerel havuzunuzu kurmanız daha iyi olur. Chromium motoruna dayalı Salıncak hafif bir web tarayıcısı gömmek için gerekiyorsa,

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

Bu benim için çalışıyor ama inanılmaz yavaş. (jquery uygulaması için sistem tarayıcısından 10 - 100 daha yavaş). Bir fikrin neden? JavaFX mi, yoksa kullanma şekliniz mi? – Daniel

+0

Ben JavaFX olduğuna inanıyorum. Bahsettiğim gibi, makinemde de yavaştır, ancak bunun OS X'de hala beta olması nedeniyle olduğunu düşündüm. – scravy

+0

Win7x64 ve WinXP FYI – Daniel

3

, sen JxBrowser kütüphanede bir göz atabilirsiniz.

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 sayfası Krom motoru tarafından sağlanacaktır: Aşağıdaki kod bazı web sayfasını JFrame içine Tarayıcı bileşenini gömmek ve yüklenemedi gösterilmiştir.

Bu açık kaynak projeleri için ücretsiz;) muz ile

+0

İpucu için çok teşekkürler! –

+1

Artık BEDAVA DEĞİL ... –

+0

Ücretsiz bir Açık Kaynak lisansı istemek için lütfen [Değerlendirme] (https://www.teamdev.com/jxbrowser#evaluate) web formunu kullanın. – Vladimir

İlgili konular