Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド

Japan Java User Group Cross Community Conferece 2012 Spring
"From Swing to JavaFX
- SwingからJavaFXへのマイグレーションガイド"

From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド

  1. 1. From Swing To JavaFX SwingからJavaFXへの マイグレーションガイド Java in the Box 櫻庭 祐一
  2. 2. JavaFX の基本
  3. 3. JavaFX 次世代の Java の GUI Library機能的には Swing+Java2D+α JavaSE8 から標準 (JavaFX3.0)
  4. 4. public class Hello extends Application { @Override public void start(Stage stage) { // コンテナ Group container = new Group(); // Scene Graph のルートを生成し、コンテナを貼る Scene scene = new Scene(container, 100, 20); stage.setScene(scene); // ラベルを生成しコンテナに貼る Label label = new Label("Hello, World!"); container.getChildren().add(label); } stage.show(); SceneGraph public static void main(String[] args) { Application.launch(args); }} アプリケーションスレッドの起動
  5. 5. はまりそうなところコンテナへの追加 pane.add(comp); pane.getChildren().add(comp);イベント リスナは1種類のみ button.setOnAction( new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { // イベント処理 } });
  6. 6. Observer PatternBind View Model Event Controller
  7. 7. Bind View Model Bind Controller
  8. 8. Bind View Model Bind Controller // モデル DoubleProperty xProperty = new DoubleProperty(); Slider slider = new Slider(50, 300, 0); // モデルにスライダの値をバインドさせる xProperty.bind(slider.valueProperty()); Rectangle rect = new Rectangle(50, 10, 50, 30); // 四角の x 座標にモデルをバインドさせる rect.xProperty().bind(xProperty);
  9. 9. シナリオで考えるマイグレーション シナリオ 1 JavaFX in Swing シナリオ 2 Swing to JavaFX w/o FXML シナリオ 3 Swing to JavaFX w/ FXML
  10. 10. JavaFX in Swing Swing アプリケーションに JavaFX を埋め込む 逆はサポートしないJavaFX でしかできないことを Swing へ Web メディア グラフ アニメーション
  11. 11. JavaFX in Swing Swing アプリケーションに JavaFX を埋め込む 逆はサポートしないJavaFX でしかできないことを Swing へ Web メディア グラフ アニメーション
  12. 12. JFXPanel Swing に貼れる JavaFX 部品 JFXPanel にはシーングラフを記述 final JFXPanel fxPanel = new JFXPanel(); Swing EDT jframe.add(fxPanel); Platform.runLater(new Runnable() { @Override public void run() { JavaFX App Thread AnchorPane root = new AnchorPane(); Scene scene = new Scene(root); root.getChildren().add(new Button("JavaFX Button")); fxPanel.setScene(scene); } });
  13. 13. Swing to JavaFX w/o FXML Swing を JavaFX に書き換える 使い方がほとんど同じもの Label,Button,TextField, et al. やり方は違うが、概念は同じもの レイアウト 使い方が違うもの TableView,TreeView,ListView
  14. 14. Button Swing JButton = new JButton(”Swing”); button.addActionListener(new ActionListener() { @Override public void actionPerformed(new ActionEvent event) { // イベント処理 } }); JavaFX Button = new Button(”JavaFX”); button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { // イベント処理 } });
  15. 15. LayoutSwing: コンテナ + レイアウトマネージャ JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(comp, BorderLayout.CENTER);JavaFX: コンテナがレイアウトを含む BorderPane pane = new BorderPane(); pane.setCenter(comp);
  16. 16. TableSwing: TableModelJavaFX: Bean を Column にバインド class Student { ...... } // Java Bean TableView<Student> table = new TableView<>(); TableColumn col1 = new TableColumn("Name"); col1.setCellValueFactory( new PropertyValueFactory<Student, String>("name") ); TableColumn col2 = new TableColumn("Grad Year"); col2.setCellValueFactory( new PropertyValueFactory<Student, Integer>("gradYear") ); table.setItems(students); table.getColumns().addAll(col1, col2);
  17. 17. Swing to JavaFX w/ FXML
  18. 18. FXML GUI の構造を XML で表す シーングラフを表現するスキーマレス クラス : 要素 プロパティ : 属性 or 要素 Java との連携
  19. 19. <AnchorPane prefHeight="400.0" prefWidth="600.0"> <children> <HBox alignment="CENTER" prefHeight="50.0" prefWidth="572.0" spacing="20.0"> <children> <TextField prefWidth="200.0" style="-fx-font-size: 24;" /> <Button style="-fx-font-size: 24;" text="Load" /> </children> </HBox> <WebView prefHeight="302.0" prefWidth="572.0" /> </children></AnchorPane>AnchorPane pane = FXMLLoader.load( this.getClass().getResource("browser.fxml"));
  20. 20. FXML と Java の連携 View Controller Model FXML Java Javafx:id @FXML#method
  21. 21. <AnchorPane xmlns:fx="http://javafx.com/fxml" fx:controller="contents.BrowserController"> <children> <HBox> <children> <TextField fx:id="textfield" /> <Button onAction="#handleAction" /> </children> </HBox> <WebView fx:id="webview" /> </children> public class BrowserController implements Initializable {</AnchorPane> @FXML private TextField textfield; @FXML private WebView webview; private WebEngine engine; @FXML public void handleAction(ActionEvent event) { engine.load(textfield.getText()); } @Override public void initialize(URL url, ResourceBundle rb) { engine = webview.getEngine(); } }
  22. 22. Tool Java NetBeans FXML Scene Builder
  23. 23. Conclusion マイグレーション 3 つのシナリオ Component ベースなら それほど違いはない FXML今日やらなかったこと CSS, Animaction, Effect Shape, 非同期処理
  24. 24. From Swing To JavaFX SwingからJavaFXへの マイグレーションガイド Java in the Box 櫻庭 祐一

×