質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

767閲覧

JavaFX ログインフォームでログインした時に・・・

P_Beginner

総合スコア99

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/29 12:07

編集2019/01/30 07:03

ログインフォームでIDとパスワードを入力してログインした時に,ログイン時の画面(Login.fxml)から別の画面(Menu.fxml)へ遷移します.ウィンドウは,可能であればずっと1つ(新規ウィンドウをいちいち開かない)にしたいです.

この時の遷移の仕方がわかりません.

ログインに成功した場合のif文に遷移する命令を記述するだけでいいのか,それとも遷移先のコントローラーにも何らかの命令(遷移元の情報など)を記述する必要があるのでしょうか?
あと,ログインできるのならばログアウトもできなければならないので,上記とは逆の遷移の場合も同じような記述になるのでしょうか?

あと,メソッドがあるような場合は,メソッドの記述形式や例を挙げてくれるとありがたいです.

ファイル構造

testパッケージ直下に以下のファイル
Login.java
LoginController.java
MenuController.java
Login.fxml
Menu.fxml

(Login.javaのようにMenu.javaも作ったほうがいいんでしょうか・・・?)

プログラムソース(Login.java)

Java

1package testSystem; 2import javafx.application.Application; 3import javafx.fxml.FXMLLoader; 4import javafx.scene.Parent; 5import javafx.scene.Scene; 6import javafx.stage.Stage; 7 8public class Login extends Application { 9 @Override 10 public void start(Stage primaryStage) { 11 try { 12 //FXMLからのシーングラフの読み込み 13 FXMLLoader loader = new FXMLLoader(getClass().getResource("Login.fxml")); 14 Parent root = loader.load(); 15 16 //シーングラフのルートノードを設定したシーンの作成 17 Scene scene = new Scene(root,600,400); 18 //ステージへのシーンの設定 19 primaryStage.setScene(scene); 20 primaryStage.setTitle("ログイン画面"); 21 primaryStage.show(); 22 } catch(Exception e) { 23 e.printStackTrace(); 24 } 25 } 26 public static void main(String[] args) { 27 launch(args); 28 } 29} 30

プログラムソース(LoginController.java)

Java

1package testSystem; 2 3import java.net.URL; 4import java.util.ResourceBundle; 5 6import javafx.beans.binding.BooleanBinding; 7import javafx.event.ActionEvent; 8import javafx.fxml.FXML; 9import javafx.scene.control.Button; 10import javafx.scene.control.Hyperlink; 11import javafx.scene.control.Label; 12import javafx.scene.control.PasswordField; 13import javafx.scene.control.TextField; 14 15public class LoginController { 16 17 @FXML 18 private ResourceBundle resources; 19 20 @FXML 21 private URL location; 22 23 @FXML 24 private TextField id; 25 26 @FXML 27 private PasswordField passwd; 28 29 @FXML 30 private Button loginButton; 31 32 @FXML 33 private Hyperlink createLink; 34 35 @FXML 36 private Label warning; 37 38 @FXML 39 void initialize() { 40 assert id != null : "fx:id=\"id\" was not injected: check your FXML file 'Login.fxml'."; 41 assert passwd != null : "fx:id=\"passwd\" was not injected: check your FXML file 'Login.fxml'."; 42 assert loginButton != null : "fx:id=\"loginButton\" was not injected: check your FXML file 'Login.fxml'."; 43 assert createLink != null : "fx:id=\"createLink\" was not injected: check your FXML file 'Login.fxml'."; 44 assert warning != null : "fx:id=\"warning\" was not injected: check your FXML file 'Login.fxml'."; 45 BooleanBinding idIsEmpty = id.textProperty().isEmpty(); 46 BooleanBinding passwdIsEmpty = passwd.textProperty().isEmpty(); 47 loginButton.disableProperty().bind(idIsEmpty.or(passwdIsEmpty)); 48 } 49 50 @FXML 51 public void OnClick(ActionEvent event) { 52 String idNumber = id.getText(); 53 String password = passwd.getText(); 54 55 if(idNumber.equals("test")&&password.equals("test")) { 56 System.out.print("id:"+idNumber+" pass:"+password+" → "); 57 System.out.println("成功"); 58 id.setText(""); 59 passwd.setText(""); 60 warning.setText("OK");//確認用,通常はここで画面遷移 61 } 62 else { 63 System.out.print("id:"+idNumber+" pass:"+password+" → "); 64 System.out.println("失敗"); 65 id.setText(""); 66 passwd.setText(""); 67 warning.setText("※正しいアカウント情報を入力してください"); 68 } 69 } 70} 71

プログラムソース(MenuController.java)

まあ,テスト用なので遷移先の画面はまだ作っていません.
ただ,ログイン状態からログアウトもできるようにしたいので,こちらからログイン画面(Login.fxml)へ遷移できるようにもしたいです.

Java

1package testSystem; 2 3import java.net.URL; 4import java.util.ResourceBundle; 5 6import javafx.fxml.FXML; 7 8public class MenuController { 9 10 @FXML 11 private ResourceBundle resources; 12 13 @FXML 14 private URL location; 15 16 @FXML 17 void initialize() { 18 } 19} 20 21

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/01/29 21:38

解決していない質問のコードは参考にできません。せめて解決してから質問してください
guest

回答1

0

ベストアンサー

画面の遷移(ビューの切り替え)

JavaFXではStageがウィンドウに当たります。
Stageに表示される中身はSceneですが、Sceneは任意の時点でStageインスタンスに設定しなおせますので画面を切り替えるなら

stage.setScene(遷移先の画面を表すScene)

とすれば画面遷移ができます。

コントローラーへ情報を渡す

ビューごとにコントローラーがあるものとして考えます。JavaFXではFXMLにビューの外観とコントローラークラスを両方記述し、ロードするとビューとコントローラーが自動的に両方生成されコントローラーが生成されたビューに自動的に結合される(コントローラーの@FXMLアノテーション付きのフィールドに生成さらたビュー内の特定のNodeが自動的に注入される)ようになっています。

しかしコントローラーにはビュー以外に「その画面で操作しようとするモデルの情報」も必要です。例えばログイン後にユーザーに関する操作をするわけですが「そのユーザーが何者か」をモデルとしてコントローラーが知ってなければなりませんね?JavaFXではビューとコントローラーの関係や自動的な結合についてはよきに計らってくれますが、モデルのコントローラー間の引き渡しは自前で設計する必要があります。
自由度が高いので色々やり方があると思います。
自分の好みはコントローラーのファクトリーを用意してその引数にモデルを渡すスタイルです。

java

1// LoginController.java 2public class LoginController { 3 @FXML 4 private TextField idField; 5 @FXML 6 private PasswordField pwField; 7 @FXML 8 private Button loginButton; 9 10 @FXML 11 private void initialize() { 12 loginButton.disableProperty().bind( 13 idField.textProperty().isEmpty().or(pwField.textProperty().isEmpty())); 14 loginButton.setOnAction(ev -> { 15 if (idField.getText().equals("ksoh") && 16 pwField.getText().equals("password")) { 17 User user = new User(idField.getText()); 18 try { 19 Scene scene = new Scene(MainMenuController.createView(user)); 20 ((Stage)loginButton.getScene().getWindow()).setScene(scene); 21 } catch (IOException e) { 22 assert false; 23 } 24 } 25 }); 26 } 27} 28 29// MainManuController.java 30public class MainMenuController { 31 public static Parent createView(User user) throws IOException { 32 FXMLLoader loader = new FXMLLoader(MainMenuController.class.getResource("MainMenu.fxml")); 33 Parent root = loader.load(); 34 MainMenuController controller = loader.getController(); 35 controller.setModel(user); 36 return root; 37 } 38 39 User user; 40 41 private void setModel(User user) { 42 this.user = user; 43 } 44 45 @FXML 46 private void initialize() { 47 ... 48 } 49}

(importやfxmlの内容は省略。fxmlを省略しているのでボタンのアクションはコードで設定している例にしてますが、もちろんアクションをメソッドして記述してもOKです)
実際に多数の画面を持つアプリケーションを設計する際には、同じようなコードをあちこちのクラスに記述するのはよくないのでしかるべき共通的なメソッドで遷移関連を実装すると思いますがそれは本質問とは別次元の話ですので上記コード例では基本的な考え方のみ書いてみました。

投稿2019/01/30 03:48

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

P_Beginner

2019/01/31 06:52

質問文に記載したLogin.javaの一部を使おうと思い,ログイン認証に成功した場合のif文の中に FXMLLoader loader = new FXMLLoader(getClass().getResource("Menu.fxml")); Parent root = loader.load(); Scene scene = new Scene(root,600,400); primaryStage.setScene(scene); primaryStage.setTitle("test"); primaryStage.show(); を入れてエラーになりました. これはLoginController.javaだけが問題なのでしょうか? それともLogin.javaも直したほうがいいのでしょうか? また,回答にも書いてもらったログイン情報の保持に関しては質問文のソースの構造を極力変えずに作ることは可能でしょうか?
KSwordOfHaste

2019/01/31 11:36

すみませんが、一部のコードだけみて、かつ「エラーになりました」だけではわかりません。 おそらくコンパイルエラーではないかと想像しますが、もしそうなら閲覧者が再現できるよう「小さくかつ完全なコード」を質問文の中で提示したほうがよいです。コンパイルエラーは極力自分で解決できることが望ましいですが厳しいのでしたらできるだけ自分で調べたり考えたりした上で新たに質問を挙げたほうがよいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問