DrawShapesImp.java
package jp.ac.utsunomiya_u.is; import javafx.application.Application; import javafx.stage.Stage; public class DrawShapesImp extends Application { /** * startメソッドのオーバーライド * * @param primaryStage Stageのインスタンス * @throws Exception */ @Override public void start(Stage primaryStage) throws Exception { // primaryStageを表示 primaryStage.show(); } public static void main(String[] args) { // JavaFXの起動のために必須 launch(args); } }
DrawShapesImp.javaへの追加
package jp.ac.utsunomiya_u.is; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.shape.Line; import javafx.stage.Stage; public class DrawShapesImp extends Application { /** * startメソッドのオーバーライド * * @param primaryStage Stageのインスタンス * @throws Exception */ @Override public void start(Stage primaryStage) throws Exception { // primaryStageタイトル設定 primaryStage.setTitle("DrawShapesImp"); // Groupのインスタンスrootを生成 Group root = new Group(); // Sceneのインスタンスsceneを生成 Scene scene = new Scene(root, 400, 400); // Lineのインスタンスline1を生成 Line line1 = new Line(); // 始点設定 line1.setStartX(0); line1.setStartY(0); // 終点設定 line1.setEndX(100); line1.setEndY(100); // rootの子のリストにline1を追加 root.getChildren().add(line1); // primaryStageにsceneを登録 primaryStage.setScene(scene); // primaryStageを表示 primaryStage.show(); } public static void main(String[] args) { // JavaFXの起動のために必須 launch(args); } }
出力
DrawShapesImp.javaへの追加
package jp.ac.utsunomiya_u.is; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public class DrawShapesImp extends Application { private Rectangle rectangle = null; /** * startメソッドのオーバーライド * * @param primaryStage Stageのインスタンス * @throws Exception */ @Override public void start(Stage primaryStage) throws Exception { // primaryStageタイトル設定 primaryStage.setTitle("DrawShapesImp"); // Groupのインスタンスrootを生成 Group root = new Group(); // Sceneのインスタンスsceneを生成 Scene scene = new Scene(root, 400, 400); // Lineのインスタンスline1を生成 Line line1 = new Line(); // 始点設定 line1.setStartX(0); line1.setStartY(0); // 終点設定 line1.setEndX(100); line1.setEndY(100); // rootの子のリストにline1を追加 root.getChildren().add(line1); // Lineのインスタンスline2を生成(始点,終点設定) Line line2 = new Line(10, 10, 110, 10); // line2の色を青に設定 line2.setStroke(Color.BLUE); // line2の幅を5pxに設定 line2.setStrokeWidth(5); // Circleのインスタンスcircleを生成(中心点,半径) Circle circle = new Circle(100, 100, 20); // circleを赤で塗りつぶす circle.setFill(Color.RED); // rootの子のリストにline2とcircleを追加 root.getChildren().addAll(line2, circle); // Rectangleのインスタンスrectangleを生成(左上座標と幅,高さ指定) rectangle = new Rectangle(200, 200, 50, 30); // rootの子のリストにrectangleを追加 root.getChildren().add(rectangle); // primaryStageにsceneを登録 primaryStage.setScene(scene); // primaryStageを表示 primaryStage.show(); } public static void main(String[] args) { // JavaFXの起動のために必須 launch(args); } }
出力
DrawShapesImp.javaへの追加
package jp.ac.utsunomiya_u.is; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public class DrawShapesImp extends Application implements EventHandler<MouseEvent> { private Rectangle rectangle = null; /** * startメソッドのオーバーライド * * @param primaryStage Stageのインスタンス * @throws Exception */ @Override public void start(Stage primaryStage) throws Exception { // primaryStageタイトル設定 primaryStage.setTitle("DrawShapesImp"); // Groupのインスタンスrootを生成 Group root = new Group(); // Sceneのインスタンスsceneを生成 Scene scene = new Scene(root, 400, 400); // Lineのインスタンスline1を生成 Line line1 = new Line(); // 始点設定 line1.setStartX(0); line1.setStartY(0); // 終点設定 line1.setEndX(100); line1.setEndY(100); // rootの子のリストにline1を追加 root.getChildren().add(line1); // Lineのインスタンスline2を生成(始点,終点設定) Line line2 = new Line(10, 10, 110, 10); // line2の色を青に設定 line2.setStroke(Color.BLUE); // line2の幅を5pxに設定 line2.setStrokeWidth(5); // Circleのインスタンスcircleを生成(中心点,半径) Circle circle = new Circle(100, 100, 20); // circleを赤で塗りつぶす circle.setFill(Color.RED); // rootの子のリストにline2とcircleを追加 root.getChildren().addAll(line2, circle); // Rectangleのインスタンスrectangleを生成(左上座標と幅,高さ指定) rectangle = new Rectangle(200, 200, 50, 30); // rootの子のリストにrectangleを追加 root.getChildren().add(rectangle); // rectangleがドラッグされた時のイベント処理を自身に指定 rectangle.setOnMouseDragged(this); // primaryStageにscenceを登録 primaryStage.setScene(scene); // primaryStageを表示 primaryStage.show(); } public static void main(String[] args) { // JavaFXの起動のために必須 launch(args); } /** * handleメソッドのオーバーライド * * @param event マウスイベント */ @Override public void handle(MouseEvent event) { // rectangleの左上座標をドラッグ時のカーソルの座標に設定 rectangle.setX(event.getX()); rectangle.setY(event.getY()); } }
DrawShapesAno.java
package jp.ac.utsunomiya_u.is; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public class DrawShapesAno extends Application { private Rectangle rectangle = null; /** * startメソッドのオーバーライド * * @param primaryStage Stageのインスタンス * @throws Exception */ @Override public void start(Stage primaryStage) throws Exception { // primaryStageタイトル設定 primaryStage.setTitle("DrawShapesAno"); // Groupのインスタンスrootを生成 Group root = new Group(); // Sceneのインスタンスsceneを生成 Scene scene = new Scene(root, 400, 400); // Lineのインスタンスline1を生成 Line line1 = new Line(); // 始点設定 line1.setStartX(0); line1.setStartY(0); // 終点設定 line1.setEndX(100); line1.setEndY(100); // rootの子のリストにline1を追加 root.getChildren().add(line1); // Lineのインスタンスline2を生成(始点,終点設定) Line line2 = new Line(10, 10, 110, 10); // line2の色を青に設定 line2.setStroke(Color.BLUE); // line2の幅を5pxに設定 line2.setStrokeWidth(5); // Circleのインスタンスcircleを生成(中心点,半径) Circle circle = new Circle(100, 100, 20); // circleを赤で塗りつぶす circle.setFill(Color.RED); // rootの子のリストにline2とcircleを追加 root.getChildren().addAll(line2, circle); // Rectangleのインスタンスrectangleを生成(左上座標と幅,高さ指定) rectangle = new Rectangle(200, 200, 50, 30); // rootの子のリストにrectangleを追加 root.getChildren().add(rectangle); // rectangleがドラッグされた時のイベント処理を設定 rectangle.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { // rectangleの左上座標をドラッグ時のカーソルの座標に設定 rectangle.setX(event.getX()); rectangle.setY(event.getY()); } }); // primaryStageにsceneを登録 primaryStage.setScene(scene); // primaryStageを表示 primaryStage.show(); } public static void main(String[] args) { // JavaFXの起動のために必須 launch(args); } }
DrawShapesAno.javaの修正
package jp.ac.utsunomiya_u.is; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public class DrawShapesAno extends Application { private Rectangle rectangle = null; /** * startメソッドのオーバーライド * * @param primaryStage Stageのインスタンス * @throws Exception */ @Override public void start(Stage primaryStage) throws Exception { // primaryStageタイトル設定 primaryStage.setTitle("DrawShapesAno"); // Groupのインスタンスrootを生成 Group root = new Group(); // Sceneのインスタンスsceneを生成 Scene scene = new Scene(root, 400, 400); // Lineのインスタンスline1を生成 Line line1 = new Line(); // 始点設定 line1.setStartX(0); line1.setStartY(0); // 終点設定 line1.setEndX(100); line1.setEndY(100); // rootの子のリストにline1を追加 root.getChildren().add(line1); // Lineのインスタンスline2を生成(始点,終点設定) Line line2 = new Line(10, 10, 110, 10); // line2の色を青に設定 line2.setStroke(Color.BLUE); // line2の幅を5pxに設定 line2.setStrokeWidth(5); // Circleのインスタンスcircleを生成(中心点,半径) Circle circle = new Circle(100, 100, 20); // circleを赤で塗りつぶす circle.setFill(Color.RED); // rootの子のリストにline2とcircleを追加 root.getChildren().addAll(line2, circle); // Rectangleのインスタンスrectangleを生成(左上座標と幅,高さ指定) rectangle = new Rectangle(200, 200, 50, 30); // rootの子のリストにrectangleを追加 root.getChildren().add(rectangle); // rectangleがドラッグされた時のイベント処理を設定 rectangle.setOnMouseDragged((MouseEvent event) -> { // rectangleの左上座標をドラッグ時のカーソルの座標に設定 rectangle.setX(event.getX()); rectangle.setY(event.getY()); }); // primaryStageにsceneを登録 primaryStage.setScene(scene); // primaryStageを表示 primaryStage.show(); } public static void main(String[] args) { // JavaFXの起動のために必須 launch(args); } }
DrawShapesAno.javaの修正
package jp.ac.utsunomiya_u.is; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; import javafx.scene.shape.Rectangle; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.stage.Stage; public class DrawShapesAno extends Application { private Rectangle rectangle = null; /** * startメソッドのオーバーライド * * @param primaryStage Stageのインスタンス * @throws Exception */ @Override public void start(Stage primaryStage) throws Exception { // Stageタイトル設定 primaryStage.setTitle("DrawShapesAno"); // Groupのインスタンスrootを生成 Group root = new Group(); // Sceneのインスタンスsceneを生成 Scene scene = new Scene(root, 400, 400); // Lineのインスタンスline1を生成 Line line1 = new Line(); // 始点設定 line1.setStartX(0); line1.setStartY(0); // 終点設定 line1.setEndX(100); line1.setEndY(100); // rootの子のリストにline1を追加 root.getChildren().add(line1); // Lineのインスタンスline2を生成(始点,終点設定) Line line2 = new Line(10, 10, 110, 10); // line2の色を青に設定 line2.setStroke(Color.BLUE); // line2の幅を5pxに設定 line2.setStrokeWidth(5); // Circleのインスタンスcircleを生成(中心点,半径) Circle circle = new Circle(100, 100, 20); // circleを赤で塗りつぶす circle.setFill(Color.RED); // rootの子のリストにline2とcircleを追加 root.getChildren().addAll(line2, circle); // Rectangleのインスタンスrectangleを生成(左上座標と幅,高さ指定) rectangle = new Rectangle(200, 200, 50, 30); // rootの子のリストにrectangleを追加 root.getChildren().add(rectangle); // rectangleがドラッグされた時のイベント処理を設定 rectangle.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { // rectangleの左上座標をドラッグ時のカーソルの座標に設定 rectangle.setX(event.getX()); rectangle.setY(event.getY()); } }); // Textのインスタンスtextを生成(位置,文字列) Text text = new Text(100, 100, "Hello Java FX!"); // rootの子のリストにtextを追加 root.getChildren().add(text); // sceneにKeyPressedイベントを登録 scene.setOnKeyPressed(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent event) { if (event.getText().equals("b")) { // 押下されたキーが"b"と等しければ text.setFont(new Font(text.getFont().getSize() + 1)); // フォントサイズを現在のフォントサイズに1足したものに変更 } else if (event.getText().equals("s")) { // 押下されたキーが"s"と等しければ text.setFont(new Font(text.getFont().getSize() - 1)); // フォントサイズを現在のフォントサイズから1引いたものに変更 } } }); // primaryStageにsceneを登録 primaryStage.setScene(scene); // primaryStageを表示 primaryStage.show(); } public static void main(String[] args) { // JavaFXの起動のために必須 launch(args); } }
出力
クラス名 | 説明 |
---|---|
BorderPane | 上、左、右、下、中央の各位置に子をレイアウトします |
HBox | 単一の水平行に子をレイアウトします |
VBox | 単一の垂直列に子をレイアウトします |
StackPane | 下から上へのスタックに子をレイアウトします |
GridPane | 行と列の柔軟なグリッド内に子をレイアウトします |
FlowPane | フローペインの境界で折り返されるフローに子をレイアウトします |
TilePane | 均一サイズのタイルのグリッドに子をレイアウトします |
AnchorPane | 子ノードの枠をアンカー・ペインの枠からのオフセット位置までアンカーします |
LayoutTest.java
package jp.ac.utsunomiya_u.is; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class LayoutTest extends Application { @Override public void start(Stage primaryStage) throws Exception { // primaryStageのタイトルを設定 primaryStage.setTitle(getClass().getName()); // BorderPaneのインスタンスrootを生成 BorderPane root = new BorderPane(); // Sceneのインスタンスsceneを生成 Scene scene = new Scene(root); // primaryStageにscenceを登録 primaryStage.setScene(scene); // TextAreaのインスタンスtextAreaを生成 TextArea textArea = new TextArea(); // textAreaを編集不可に設定 textArea.setEditable(false); // TextFieldのインスタンスtextFieldを生成 TextField textField = new TextField(); // Buttonのインスタンスbuttonを生成(表示文字を引数で指定) Button button = new Button("submit"); // buttonが押下された時のイベントを設定 button.setOnAction((ActionEvent event) -> { // textFieldに入力された文字をgetTextで取得し,appendTextでtextAreaに追記 textArea.appendText(textField.getText() + "\n"); // textFieldをクリア textField.clear(); }); // textAreaをTopに貼付け root.setTop(textArea); // textFieldをCenterに貼付け root.setCenter(textField); // buttonをRightに貼付け root.setRight(button); // primaryStageを表示 primaryStage.show(); } public static void main(String[] args) { launch(args); } }
出力
Workerインターフェース | バックグラウンドスレッドがUIと通信するために利用 |
Taskクラス | バックグラウンド処理をcallメソッドをオーバーライドすることで実装.再利用不可 |
Serviceクラス | 1つ以上のバックグラウンドスレッド上でTaskのインスタンスを実行可能.再利用可 |
ConcurrentTest.java
package jp.ac.utsunomiya_u.is; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javafx.application.Application; import javafx.concurrent.Service; import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ProgressBar; import javafx.scene.control.ProgressIndicator; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.stage.WindowEvent; public class ConcurrentTest extends Application { @Override public void start(Stage primaryStage) throws Exception { // primaryStageのタイトル設定 primaryStage.setTitle(getClass().getName()); // Groupのインスタンスrootを生成 VBox root = new VBox(); // Sceneのインスタンスsceneを生成 Scene scene = new Scene(root); // primaryStageにscenceを登録 primaryStage.setScene(scene); // Buttonのインスタンスbuttonを生成 Button button = new Button("start"); // Labelのインスタンスlabelを生成 Label label = new Label(); // ProgressBarのインスタンスprogressBarを生成 ProgressBar progressBar = new ProgressBar(0); // buttonとlabelとprogressBarをrootに貼付け root.getChildren().addAll(button, label, progressBar); // buttonにイベント処理規定 button.setOnAction((ActionEvent event) -> { // Taskのインスタンスtask生成 Task<Void> task = getTask(); // labelのtextプロパティにtaskのmessageプロパティをバインド label.textProperty().bind(task.messageProperty()); // pregressBarのprogressプロパティにtaskのprogressプロパティをバインド progressBar.progressProperty().bind(task.progressProperty()); // スレッドプールをnewSingleThreadExecutorで生成 ExecutorService executorService = Executors.newSingleThreadExecutor(); // taskの実行 executorService.submit(task); // スレッドプールの終了 executorService.shutdown(); primaryStage.setOnCloseRequest((WindowEvent event1) -> { // ウィンドウが閉じられたなら // taskをキャンセル task.cancel(); }); }); // Buttonのインスタンスbutton2を生成 Button button2 = new Button("start"); // Labelのインスタンスlabel2を生成 Label label2 = new Label(); // ProgressIndicatorのインスタンスprogressIndicatorを生成 ProgressIndicator progressIndicator = new ProgressIndicator(0); // buttonとlabelとprogressIndicatorをrootに貼付け root.getChildren().addAll(button2, label2, progressIndicator); // button2にイベント処理規定 button2.setOnAction((ActionEvent event) -> { // Serviceのインスタンスserviceを生成 Service<Void> service = new Service<Void>() { // 抽象メソッドcreateTaskをオーバーライド @Override protected Task<Void> createTask() { // Taskのインスタンスを返す return getTask(); } }; // serviceを開始 service.start(); // label2のtextプロパティにserviceのmessageプロパティをバインド label2.textProperty().bind(service.messageProperty()); // pregressIndicatorのprogressプロパティにserviceのprogressプロパティをバインド progressIndicator.progressProperty().bind(service.progressProperty()); }); // primaryStageを表示 primaryStage.show(); } /** * Taskのインスタンス生成 * * @return Taskのインスタンス */ private Task<Void> getTask() { return new Task<Void>() { // 抽象メソッドcallをオーバーライド @Override protected Void call() throws Exception { for (double i = 0; i <= 1.01; i += 0.01) { // messageプロパティを更新 updateMessage(String.format("%2d%%", (int) (i * 100))); // progressプロパティを更新 updateProgress(i, 1.0); // 100[ms]一時停止 Thread.sleep(100); } // messageプロパティを更新 updateMessage("finish"); return null; } }; } public static void main(String[] args) { launch(args); } }
出力