第七回JavaFX 200とSwingの統合

7173 ワード

原文の住所http://download.oracle.com/javafx/2.0/swing/jfxpub-swing.htm
 
JavaFX 2.0リリース版 JFXPanel , javafx.embed.swingパッケージには、JavaFXコンテンツをSwingプログラムにバインドすることができます.
本文はJavaFXの内容をSwingプログラムにどうやって入れるかを教えます.同時にSwingとJavaFXを備えたアプリケーションでスレッドを正しく使うかを指導します.
 
JavaFXをSwingコンポーネントに追加します.
 本明細書の目的を達成するためには、JFrameコンポーネント, JFXPanelオブジェクトを作成し、JFXAnelコンポーネントのグラフィカルシーンはJavaFXコンテンツを含む必要があります.
すべてのSwingプログラムと同じように、Event Dispartch Thread(イベントスケジュールスレッドEDT)でグラフィックユーザーインターフェース(GUI)を作成します.Example 1は、initAndShowGUIコンポーネントを作成し、 JFrameオブジェクトを追加するJFXPanel方法を示している.JFXPanelクラスを作成する例は、バックグラウンドでJavaFXの運転を開始する場合にある.GUI作成後、initFXメソッドを呼び出し、JavaFXスレッド上でJavaFXシーンを作成する.
 
Example 1
public class Test {

    private static void initAndShowGUI() {
        // This method is invoked on the EDT thread
        JFrame frame = new JFrame("FX");
        final JFXPanel fxPanel = new JFXPanel();
        frame.add(fxPanel);
        frame.setVisible(true);

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
            initFX(fxPanel);
            }
       });
    }

    private static void initFX(JFXPanel fxPanel) {
        // This method is invoked on the JavaFX thread
        Scene scene = createScene();
        fxPanel.setScene(scene);
    }

    private static Scene createScene() {
        //Code to create the JavaFX scene
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
            initAndShowGUI();
            }
        });
    }
}
 
 
JavaFX-wingの相互操作性とスレッド
JavaFXとSwingのデータが存在するため、次のような相互操作の場合があります.
  • JavaFXのデータ変更はSwingのデータ変更によるものである.
  • 逆.
  • JavaFXのデータを変えてSwingデータの変化に答えます.
    JavaFXのデータはjavaFXユーザースレッドを通じてのみアクセスできます.いつJavaFXデータを変更するにも、あなたのコードをRunnableオブジェクトで囲んでPlatform.runLaterメソッドを呼び出す必要があります.Example 2に会います
    Example 2
    jbutton.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
            Platform.runLater(new Runnable() { 
                @Override
                public void run() {
                    fxlabel.setText("Swing button clicked!"); 
                }
            });
        }
    });
    
    Swingデータを変更して、JavaFXデータの変化に答えます.
    Swingデータの変化を覚えてEDTを通過します.あなたのコードがEDTを実現し、RunnableオブジェクトをサラウンドしてSwingUtilities.invokeLaterメソッドを呼び出すことを確認します.Example 3に会います
    Example 3
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            //Code to change Swing data.
        }
    });
    
    SwingBrowser 2:JavaFXコンポーネントを統合したSwingアプリケーションSwingBrowser2を通して、Swing-JavaFXはどのように相互操作されているかを見ることができます.ブラウザのための一般的な基本機能を提供しています.そのアドレスバーにURLを入力して、アプリケーションウィンドウにロードされているページを確認することができます.ページをクリックして新しいページにリンクして、前のページに戻り、タブを開いて、ブックマークを入れて、全ページで検索できます.Figure 1は、このアプリケーションのウィンドウである.
    Figre 1 The SwingBrowser 2 appration window
    Description of「Figre 1 The SwingBrowser 2 appration window」
    Swingデータを初期化する
    NBプロジェクトのサイドバーからリンクしてswingbrowser2.zipファイルをダウンロードできます.ローカルに解凍し、Netbeans IDEからプロジェクトとして動作します.あなたのNetBens IDEバージョンがサポートされていることを確認します.
      SwingBrowser2 , GUI EDTでは.サイドバーのリンクでMain.javaファイルを参照してください.
    アプリケーションのトップウィンドウは、多くのSwingコンポーネントを含んでいるJFrameコンポーネントです.例えば、tabbedパネル、一つのmenu、いくつかのtext field、button、もう一つはJavaFXコンテンツを表示するJFXパネルです.
    JavaFXコンテンツをロードする
    運転を開始したばかりで、JFXパネルには空のWebViewオブジェクトが含まれています.アドレスバーにURLを入力すると、AddressBar.java action listenerがページのロードを開始します.コードはExample 4.
    Example 4
    txtURL.addActionListener(new ActionListener() {
        @Override public void actionPerformed(ActionEvent e) {
            browser.load(txtURL.getText());
        }
    });
    
    Browser.javaファイルのloadメソッドは、URLを検証し、call , Example 5を呼び出します.
    Example 5
    public void load(String str) {
        if (str != null {
            str = str.trim();
    
            if (str.isEmpty()) return;
    
            String url = toURL(str);
            if (url == null) {
                url = toURL("http://" + str);
            }
            if (url != null) {
            Platform.runLater (new Runnable() {
                @Override
                public void run () {
         
            call(url);
            }
        }
    }
    
    private static String toURL(String str) {
        try {
            return new URL(str).toExternalForm();
        } catch (MalformedURLException exception) {
            return null;
        }
    }
    
    JavaFXデータはJavaFXスレッド上でしかアクセスできないはずです.call URL JavaFXスレッド上にあります.Callback.javaファイルには完全なコードがあります.Example 6は、インプリメンテーションを示すコードブロックである.
    Example 6
    public final void call(final String value) {
        if (Platform.isFXApplicationThread()) {
            callImpl(value);
        }
        else {
            Platform.runLater(new Runnable() {
                @Override public void run() {
                    callImpl(value);
                }
            });
        }
    }
    
    protected void callImpl(String value) {
        getEngine().load(value);
    }
    
    Swingデータを更新しますWebViewコンポーネントが新しいページをロードすると、ページタイトルはJavaFXデータからフェッチされ、Swing GUIに渡される.ページタイトルがタブページに表示され、アプリケーションタイトルが追加されます.TabbedBrowser.javaには完全なコードがあります.Example 7は、インプリメンテーションを示すコードブロックである.
    Example 7
    public WebPane addNewTab(final String url, boolean selected) {
        ...
        final WebPane wp = new WebPane(url);
    
        wp.getBrowser().getEngine().titleProperty().addListener(
    new javafx.beans.value.ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, 
    String oldValue, final String title) {
                EventQueue.invokeLater(new Runnable() {
                    @Override public void run() {
                        setTitleAt(indexOfComponent(wp), title);
                        setToolTipTextAt(indexOfComponent(wp), title);
    
                        if (getSelectedComponent() == wp) {
                        setWindowTitle(title);
                        }
                    }
                )};
            }
        )};
    }
    
    二つの統合アプリケーションの展開方法を知りたいです.Deploying JavaFX Application sまで調べてください.