2017-05-20 2 views
3

Je travaille sur la page Web spécifique, et je veux relier ensemble javafx.embed.swing.JFXPanel avec ses caractéristiques et swing GUI. Je veux localiser jfxPanel à JTabbedPane? Voici deux méthodes pour JFXPanel.Comment localiser un WebView dans un JFXPanel dans un JTabbedPane?

private JFXPanel getSearchPanel() { 
    jfxPanel = new JFXPanel(); 
    createScene(); 
    setLayout(new BorderLayout()); 
    jfxPanel.setVisible(true); 
    return jfxPanel; 
} 

private void createScene() { 
    PlatformImpl.startup(new Runnable() { 
     @Override 
     public void run() { 
      Pane root = new WebViewPane(); 
      Scene scene = new Scene(root, 80, 50); 
      jfxPanel.setScene(scene); 
     } 
    }); 
} 

et méthode où je crée JTabbedPane pour le navigateur:

private void createNewTab() { 
     JPanel panel = new JPanel(new BorderLayout()); 
     startPage = startPageField.getText(); 
     panel.add(new JScrollPane(getSearchPanel()), BorderLayout.CENTER); 
     tabPane.setBackground(Color.PINK); 
     tabPane.addTab(startPage, panel); 
    } 

Merci pour toute aide ou contribution!

+0

Quelle est la question? – Yahya

+0

Je veux créer newTab (createNewTab()) dans mon navigateur Web et le définir sur jfxPanel. –

Répondre

2

À partir de ce example en utilisant javafx.scene.web.WebView, j'ai apporté les modifications suivantes pour produire le résultat indiqué ci-dessous. La méthode createTab() s'assure que le FXPanel a une taille préférée raisonnable et que le contenu est créé sur le thread JavaFX.

JTabbedPane jtp = new JTabbedPane(); 
jtp.add("One", createTab("http://www.example.com")); 
jtp.add("Two", createTab("http://www.example.net")); 
jtp.add("Three", createTab("http://www.example.org")); 
frame.add(jtp, BorderLayout.CENTER); 

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JTabbedPane; 
import javax.swing.SwingUtilities; 
import javafx.application.Platform; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 

/** 
* @see https://stackoverflow.com/a/44091479/230513 
* @see https://stackoverflow.com/a/31576647/230513 
*/ 
public class WebViewTest { 

    private void initAndShowGUI() { 
     // This method is invoked on the EDT thread 
     JFrame frame = new JFrame("WebViewTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JTabbedPane jtp = new JTabbedPane(); 
     jtp.add("One", createTab("http://www.example.com")); 
     jtp.add("Two", createTab("http://www.example.net")); 
     jtp.add("Three", createTab("http://www.example.org")); 
     frame.add(jtp, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private JFXPanel createTab(String s) { 
     final JFXPanel fxPanel = new JFXPanel() { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(640, 480); 
      } 
     }; 
     Platform.runLater(() -> { 
      initFX(fxPanel, s); 
     }); 
     return fxPanel; 
    } 

    private void initFX(JFXPanel fxPanel, String s) { 
     // This method is invoked on the JavaFX thread 
     StackPane root = new StackPane(); 
     Scene scene = new Scene(root); 
     WebView webView = new WebView(); 
     WebEngine webEngine = webView.getEngine(); 
     webEngine.load(s); 
     root.getChildren().add(webView); 
     fxPanel.setScene(scene); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new WebViewTest()::initAndShowGUI); 
    } 
} 

En général, d'autres implémentations de moteur web sont not supported.

+0

Merci! Ça marche pour moi –