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

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

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

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

Java

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

Q&A

解決済

1回答

2039閲覧

JavaFX ログインフォーム作成にあたり・・・

P_Beginner

総合スコア99

JavaFX

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

Java

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

0グッド

0クリップ

投稿2019/01/28 13:41

編集2019/01/29 05:59

ログインフォーム作成において,idまたはパスワードのtextFieldが空(1文字も入力されていない)の時はログインボタンを押せないようにしたいです.idとパスワードが双方1文字以上入力されていればボタンを押せるようにしたいです.
どのようにやれば良いのでしょうか?
新しくクラスを生成する必要はありますか?

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

Java

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

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/01/28 19:24

えーっと、さすがに元となるコードを貼るべきではないでしょうか? JavaFXというマイナーな技術(比較的資料が少ない)を初学に近そうな方がやっているのでフォローしてますが、ちょっと作業を省略しすぎですよ。ともあれ、 ・Key Typedイベントで入力待ち ・ButtonにsetDisable で、機能の実現はできると思います。考えてみてください。
P_Beginner

2019/01/29 02:03

Controller.java 途中までというかテスト的なものですが,作ったところまで追記しました.
P_Beginner

2019/01/29 05:20

KeyTypedの使い方ですが,調べてもわかりません. 使用例とかありますか?
Tsukasa7613

2019/01/29 05:40 編集

会話中に失礼します。動作の目的が見えないためコードを貼っていただきたいとは思いますが、推測でコメントさせていただきます。 文字が入力されていないとき「ボタンを押せなくする」のではなく、「ボタンを押しても何も処理を行わない(ログインさせない)」という記述では理想の動作は実現できないのでしょうか? P_Beginner様が初学者ならば、なおさら比較的楽に実装できる方法の模索も大切だと思います。
wwbQzhMkhhgEmhU

2019/01/29 06:48

Tsukasa7613さんのおっしゃることももっともですね。最初どっちにするか迷いました。そちらで行くのもありですよ。 とりあえず、KeyTypedですが、使い方はKeyPressedとかと同じです。そちらの使用例ならすぐ見つかると思うので参考にしてください。大雑把ですが、KeyPressedは押されたときと離されたときを区別したいときに使います。区別しないでいいときはKeyTypedでいいかと思います。細かい違いは実際動かしてみたり、別の場所で調べてみてください。
guest

回答1

0

ベストアンサー

こうした場合JavaFXではイベントハンドラーで何かするよりもっと直接的で宣言的な定義が可能です。
それはプロパティーへのバインドです。

java

1public class LoginController { 2 @FXML 3 private TextField idField; 4 @FXML 5 private PasswordField pwField; 6 @FXML 7 private Button loginButton; 8 9 @FXML 10 private void initialize() { 11 BooleanBinding idIsEmpty = idField.textProperty().isEmpty(); 12 BooleanBinding pwIsEmpty = pwField.textProperty().isEmpty(); 13 loginButton.disableProperty().bind(idIsEmpty.or(pwIsEmpty)); 14 } 15}

この例でidIsEmptyはidFieldのtextプロパティーが空かどうかを表します。注意すべきは「idFieldの状態変化に自動的に追従した真偽値を表している」点です。pwIsEmptyも同様です。この2つをand/orなどで結合することもできます。結果は「そうあってほしい」と期待するとおりの意味になります。これをloginButtonのdisablePropertyへbindすることでお望みのことが実現できます。

上記コードはイベントハンドラーで表現すると概ね以下と同様の意味になります。

java

1public class LoginController { 2 @FXML 3 private TextField idField; 4 @FXML 5 private PasswordField pwField; 6 @FXML 7 private Button loginButton; 8 9 @FXML 10 private void initialize() { 11 // 初期状態を設定 12 loginButton.setDisable(idField.getText().isEmpty() && pwField.getText().isEmpty()); 13 // idFieldのtextプロパティーが変化したらloginButtonの状態を更新 14 idField.textProperty().addListener((ov, nv, ob) -> 15 loginButton.setDisable(nv.isEmpty() && pwField.getText().isEmpty())); 16 // pwFieldのtextプロパティーが変化したらloginButtonの状態を更新 17 pwField.textProperty().addListener((ov, nv, ob) -> 18 loginButton.setDisable(nv.isEmpty() && idField.getText().isEmpty())); 19 } 20}

JavaFXのNodeの属性はほぼ例外なくJavaFXプロパティーとして表現されておりJavaFXはObservableなもの、つまり監視可能なオブジェクトとしての機能を持っています。このためchangeListenerなどで監視できるわけですがバインディングを用いるとよくある状態変化を簡潔に宣言的に表現できるのでコードの意味が把握しやすくバグも減らせると思います。

投稿2019/01/30 02:46

KSwordOfHaste

総合スコア18394

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

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

wwbQzhMkhhgEmhU

2019/02/03 00:58

回答ありがとうございます。通知が迷惑メールに入っていたので気づくのが遅くなりました。 またJavaFXにバインディングがあるとは思っておらず、ミスリーディングしてたのを軌道修正して頂き感謝です。 何かと資料が少ないと感じてならないJavaFXですが、別建てでバインディングのチュートリアルがあったので、載せておきます。 https://docs.oracle.com/javase/jp/8/javafx/properties-binding-tutorial/index.html どうもバインディングはJava 8のときに追加されたようです。今まで見てた資料では、なんかswingの方がマシと思っていましたが、バインディングまで出来るなら少し評価上がりそうです。良かったら ・JavaFXの今後の展望に関する個人的な見解(SEから外されてしまったりしてるので) ・初心者にオススメなサイト(できれば機能が網羅されているもの) などを教えて頂けたらと思います。
KSwordOfHaste

2019/02/03 02:48

自分はアマチュアなのでプロの方のような知見がないし、あまり気にしてないというのが正直なところです。ただJava8で一旦JDKへ取り込まれたJavaFXがJava11で外されたことから素人目にOracle/プロの方がJavaを主としてサーバーサイド技術としてのみ見ておりクライアントサイドの技術はおまけ(あるいは過去の遺産?)という認識であるような気はします。そのためまだまだ機能不足が多い感のあるJavaFXが活発にエンハンスされるかどうか疑問です。 ・FXMLの機能不足 ・stylesheetでのfx:xxxという属性名が不評だがいまさらどうしようもない? ・Java自身の問題でもあるがプロパティーの記述のボイラープレートコードが鬱陶しい  (多分よいアノテーションプロセッサがあればずいぶんJavaFXで書くのが楽しくなる気がしますがそういうものを自分は知りません。) 純粋に技術的側面から言えばswingの設計にあった古臭い点のいくつかは進んだ設計になっていてよいとは感じます。そのため自分はスタンドアロンGUIアプリをJavaで作るならswingでなくJavaFXを使います。ただ他のGUI構築に比べてJavaFXを積極的に使うというほどでもないので微妙なところ・・・
KSwordOfHaste

2019/02/03 03:09

残念ながら初心者にオススメなサイトを自分は知りません。JavaFXを活発に学んでいたのはJava8が出たばかりの時期でしたけど一番参考になったのはOracleのチュートリアルとリファレンスだったという認識です。当たり前だと思いますがswing/JavaFXいずれにせよ先に ・Javaそのものの知識 ・オブジェクト指向設計の経験 ・GUIの基本的考え方(イベントループ方式など) ・リファレンスを見て仕様をつかむこと ・ある程度のデバッグ技術 を身に着けているかどうかでGUIプログラミングの学習時間がかなり違ってくると思います。いわゆるプログラミングの初心者の方がJava/オブジェクト指向設計にまだ慣れてない段階でGUIを学ぼうとするのは知るべきことや前提知識が多すぎて混乱しやすいのではないでしょうか? いわゆるプログラミングの初心者の方にとって参考書的なもので段階を踏んで学ぶのがの良い方法なのではないかと思います(ご自分の実力にあった参考書を選ぶのがコツですが)。逆にJava/オブジェクト指向設計に経験があり、JavaFXのみ知らないという方なら例えば参考書を使ってもスラスラ読めるでしょうし、参考書なしにチュートリアルとリファレンスでなんとかするのも可能だと思います。
wwbQzhMkhhgEmhU

2019/02/03 03:27

ありがとうございます。 ■JavaFXの今後の展望に関する個人的な見解について そうですね。JavaFXをswingの後継として説明していいかな、という気になりました。 今どきクライアント側のGUIは滅多なことで作りませんが、作ったとしてWPF(.NET)が多い気がします。ただ、過去の遺物のエンハンスは頼まれればやることもあり(MFCとかVB6でも(こういうのは主に組込系ですが))、その際にプラットフォームの指定は変えられません。なのでJavaという指定であった場合、awt/swing/JavaFXをどう見るかは設計選択する上で重要だったりはします。そういう意味で、JavaFXをswingの後継として見れる、のは自分の中では大きいことだと思います。ありがとうございました。 ■初心者にオススメなサイト そうですか、ちょっと難しそうですね。コーディングして動かして目で見て分かる、という意味でGUIを最初にやる人はそれなりにいそうな気もしますが、難しいですよね。今どきだとJavaScriptあたりにして、Electronから入る、というのもありな気もします。Electron自体を業務で使えるかどうかは微妙ですが。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問