第7回JavaFX 200とSwingの統合

6305 ワード

原文の住所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 オブジェクトは、JFXAMANELコンポーネントのグラフィックシーンに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オブジェクトで囲んで呼び出します. 方法.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オブジェクトをサラウンドしてPlatform.runLaterを呼び出す. 方法.Exampleに会います 3.
Example 3
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        //Code to change Swing data.
    }
});
SwingBrowser 2:JavaFXコンポーネントを統合したSwingアプリケーションSwingUtilities.invokeLaterを通じて Swing-JavaFXはどのように相互操作しているかが見えます.ブラウザのための基本機能を提供しています.そのアドレスバーにURLを入力して、アプリケーションウィンドウにロードされているページを確認することができます.ページをクリックして新しいページにリンクして、前のページに戻り、タブを開いて、ブックマークを入れて、全ページで検索できます.Figure 1は、このアプリケーションのウィンドウである.
Figre 1 The SwingBrowser 2 appration window
Description of「Figre 1 The SwingBrowser 2 appration window」 
Swingデータを初期化する
NBプロジェクトのサイドバーからリンクしてSwingBrowser2をダウンロードできます. ファイルローカルに解凍し、Netbeans IDEからプロジェクトとして動作します.あなたのNetBens IDEバージョンがサポートされていることを確認します.
  swingbrowser2.zip EDTでは.枠のリンクで表示  SwingBrowser2 , GUI  ファイル
アプリケーションの最上位のウィンドウは一つです.  Main.java コンポーネントは、多くのSwingコンポーネントを含んでいます.例えば、tabbedパネル、一つのmenu、いくつかのtext field、button、もう一つはJavaFXコンテンツを表示するJFXパネルです.
JavaFXコンテンツをロードする
運転を開始したばかりで、JFXパネルには空のJFrameが含まれています. オブジェクトアドレスバーにURLを入力すると、  WebView action listenerはページの読み込みを開始します.コードはExample 4.
Example 4
txtURL.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent e) {
        browser.load(txtURL.getText());
    }
});
Browser.javaファイルのAddressBar.java  方法はURLを検証し、loadを呼び出します. 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 ,  JavaFXスレッド上call URL  ファイルに完全なコードがあります.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データを更新します
質に入れる  Callback.java コンポーネントが新しいページをロードすると、ページタイトルがJavaFXデータから取り出してSwing GUIに渡されます.ページタイトルがタブページに表示され、アプリケーションタイトルが追加されます.  WebView に完全コードがあります.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 表示します.