2014年1月24日 星期五

JavaFX與Java Swing

由於JavaFX建構於Java之上,因此JavaFX與Java Swing兩者可互通,可在Java Swing程式中使用JavaFX類別,彼此之間透過javafx.embed.swing.JFXPanel類別所建立的JavaFX Panel處理,JFXPanel類別繼承自Java Swing的JComponent抽象類別,因此JavaFX Panel可視為容器(Container),用以配置JavaFX物件。其程式架構如下:


// 繼承javax.swing.JFrame類別
public class JavaSwingDemo extends javax.swing.JFrame {

  // 主程式
  public static void main(String[] args) {
   SwingUtilities.invokeLater(new Runnable() {
     @Override public void run() {
       new JavaSwingDemo();
     }
   });
  }
  
  // 建構函式
  public JavaSwingDemo() {
    // 建立JavaFX Panel
    final JFXPanel jfxPanel = new JFXPanel();
    
    Platform.runLater(new Runnable() {
      @Override public void run() {
        // 建立JavaFX Panel
        initFX(jfxPanel);
      }
    });    
  
    // 將JavaFX Panel加入JFrame之中
    this.add(jfxPanel);
    // 設定JFrame的大小
    this.setSize(300, 300);
    // 顯示JFrame
    this.setVisible(true);  
  }
  
  private static void initFX(JFXPanel jfxPanel) {
    // 配置JavaFX Panel中的物件
  }
}


其中以JFXPanel類別建立JavaFX Panel之後,需以javafx.application.Platform類別的runLater()方法以執行緒執行JavaFX Panel,如此方能在Java Swing中正常處理JavaFX:


// 建立JavaFX Panel
final JFXPanel jfxPanel = new JFXPanel();

Platform.runLater(new Runnable() {
  @Override public void run() {
    // 建立JavaFX Panel
    initFX(jfxPanel);
  }
});


接著可使用JavaFX Panel配置JavaFX物件。以下範例示範在以Java Swing中以JFXPanel類別建立JavaFX Panel並配置JavaFX物件,其中以Accordion類別群組數個TitledPane類別,並在TitledPane中置放圖片:


【參考資料】

[1] 黃嘉輝,深入研究JavaFX 2。
[2] 黃嘉輝,深入研究Java Swing。
[5] JavaFX 2.2 API Specification.
[6] Java Platform, Standard Edition 7 API Specification.

© Chia-Hui Huang

沒有留言:

張貼留言