Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaFX8 画面遷移

Last updated at Posted at 2019-10-06

#1. 仕様
実行すると画面1を開く.
画面1には,画面2へ遷移するボタンとウィンドウを閉じるボタンがある.
画面2には,画面1へ遷移するボタンがある.

#2. ファイル構造

Eclipseでプロジェクトを作成する.

screenTrance ・・・・・・・・・・・・・(1)
 └ src ・・・・・・・・・・・・・・・・(2)
   └ pkg ・・・・・・・・・・・・ ・ (3)
     ├ Main.java ・・・・・・・・・(4)
     ├ MainController.java ・・・・ (5)
     ├ Screen.java ・・・・・・・・(6)
     ├ SubController.java ・・・・・(7)
     ├ mainScreen.fxml ・・・・・・(8)
     └ subScreen.fxml・・・・・・・(9)

(1) 作成するプロジェクト
(2) プロジェクト作成時に勝手に作られる,ソースファイル用ディレクトリ
(3) 作成するパッケージ
(4) ソースファイル(次章に記述),初期画面(画面1)起動
(5) ソースファイル(次章に記述),画面1のコントローラー
(6) ソースファイル(次章に記述),画面遷移時の画面起動
(7) ソースファイル(次章に記述),画面2のコントローラー
(8) ソースファイル(次章に記述,SceneBuilderで作成),画面1の内容
(9) ソースファイル(次章に記述,SceneBuilderで作成),画面2の内容

#3. ソースファイル
#3.1. Main.java

Main.java
package pkg;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
	@Override
	public void start(Stage primaryStage) {
		try {
			//FXMLからのシーングラフの読み込み
			FXMLLoader loader = new FXMLLoader(getClass().getResource("mainScreen.fxml"));
			Parent root = loader.load();

			//シーングラフのルートノードを設定したシーンの作成
			Scene scene = new Scene(root, 600, 400);
			//ステージへのシーンの設定
			primaryStage.setScene(scene);
			primaryStage.setTitle("画面1");
			primaryStage.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		launch(args);
	}
}

#3.2. MainController.java

MainController.java
package pkg;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;

public class MainController {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private Button nextButton;

    @FXML
    private Button closeButton;

    @FXML
    void OnclickedCloseButton(ActionEvent event) {
    	closeButton.getScene().getWindow().hide();			//画面を閉じる
    }

    @FXML
    void OnclickedNextButton(ActionEvent event) {
    	nextButton.getScene().getWindow().hide();			//画面を閉じる
    	Screen screen = new Screen();						//画面を開く(メソッド呼び出し)の準備
    	screen.transitionScreen("subScreen.fxml", "画面2");	//画面を開く
    }

    @FXML
    void initialize() {
        assert nextButton != null : "fx:id=\"nextButton\" was not injected: check your FXML file 'screen.fxml'.";
        assert closeButton != null : "fx:id=\"closeButton\" was not injected: check your FXML file 'screen.fxml'.";

    }
}

#3.3. Screen.java

Screen.java
package pkg;

import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Screen {
	public void transitionScreen(String fxmlName, String fxmlTitle) {
		try {
			//FXMLからのシーングラフの読み込み
			FXMLLoader loader = new FXMLLoader(getClass().getResource(fxmlName));
			Parent root = loader.load();

			//シーングラフのルートノードを設定したシーンの作成
			Scene scene = new Scene(root, 600, 400);
			//ステージへのシーンの設定
			Stage stage = new Stage();

			stage.setScene(scene);
			stage.setTitle(fxmlTitle);
			stage.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

#3.4. SubController.java

SubController.java
package pkg;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;

public class SubController {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private Button backButton;

    @FXML
    void OnclickedBackButton(ActionEvent event) {
    	backButton.getScene().getWindow().hide();			//画面を閉じる
    	Screen screen = new Screen();						//画面を開く(メソッド呼び出し)の準備
    	screen.transitionScreen("MainScreen.fxml", "画面1");	//画面を開く
    }

    @FXML
    void initialize() {
        assert backButton != null : "fx:id=\"backButton\" was not injected: check your FXML file 'subScreen.fxml'.";

    }
}

#3.5. mainScreen.fxml

mainScreen.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>


<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="pkg.MainController">
   <children>
      <Button fx:id="nextButton" layoutX="255.0" layoutY="184.0" mnemonicParsing="false" onAction="#OnclickedNextButton" prefHeight="33.0" prefWidth="91.0" text="画面2へ" />
      <Button fx:id="closeButton" layoutX="255.0" layoutY="337.0" mnemonicParsing="false" onAction="#OnclickedCloseButton" prefHeight="33.0" prefWidth="91.0" text="閉じる" />
      <Label alignment="CENTER" layoutX="255.0" layoutY="23.0" prefHeight="33.0" prefWidth="91.0" text="画面1">
         <font>
            <Font size="20.0" />
         </font>
      </Label>
   </children>
</Pane>

#3.6. subScreen.fxml

subScreen.java
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="pkg.SubController">
   <children>
      <Button fx:id="backButton" layoutX="255.0" layoutY="184.0" mnemonicParsing="false" onAction="#OnclickedBackButton" prefHeight="33.0" prefWidth="91.0" text="画面1へ" />
      <Label alignment="CENTER" layoutX="255.0" layoutY="23.0" prefHeight="33.0" prefWidth="91.0" text="画面2">
         <font>
            <Font size="20.0" />
         </font>
      </Label>
   </children>
</Pane>

#4. 実際の画面の画像
##4.1. 画面1

screen1.png

##4.2. 画面2

screen2.png
0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Comments

No comments

Let's comment your feelings that are more than good

Qiita Conference 2024 Autumn will be held!: 11/14(Thu) - 11/15(Fri)

Qiita Conference is the largest tech conference in Qiita!

Keynote Speaker

Takahiro Anno, Masaki Fujimoto, Yukihiro Matsumoto(Matz), Shusaku Uesugi / Nicolas Ishihara(Vercel Inc.)

View event details

Being held Article posting campaign

0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address