前提・実現したいこと
GUIアプリケーションの練習を兼ねて、ログイン画面を作っています。
まず、ホーム画面があって、その画面のログインボタンを押すとログイン用のユーザー名とパスワードを入力するフィールドを持ったウィンドウが出てくるのですが、今のままだとこの画面をいくらでも出すことができてしまいます。
そうなってしまうと困るので、よくアプリにある入力中のウィンドウ以外をクリックすると警告音とともに、ウィンドウがチカチカと点滅する機能を実装したいと思っています。
質問の前に検索してみようと思い、何と検索すればいいのかわからず、一応「JavaFX ウィンドウ 点滅」とかで検索したのですが何もヒットしませんでした。
一応参考のためにコードはすべて貼りましたが、このコードを動くように書き直してほしいという意図ではありません。
また、この機能に名称があるなら教えていただけると助かります。
現在の画面
上の画面のログインを押すと下の画面が出ます。
この状態だと、ホーム画面のログインを押すたびにウィンドウが出てしまいます。
サインアップボタンの先はまだ作っていません
該当のソースコード
Main.java
java
1 2import javafx.application.Application; 3import javafx.fxml.FXMLLoader; 4import javafx.scene.Scene; 5import javafx.scene.layout.VBox; 6import javafx.stage.Stage; 7 8public class Main extends Application { 9 10 @Override 11 public void start(Stage primaryStage) throws Exception { 12 13 VBox root = FXMLLoader.load(getClass().getResource("./MainWindow.fxml")); 14 15 primaryStage.setScene(new Scene(root)); 16 primaryStage.show(); 17 18 } 19 20 public static void main(String[] args) { 21 22 launch(); 23 24 } 25 26} 27
fxml
1 2MainWidow.fxml 3<?xml version="1.0" encoding="UTF-8"?> 4 5<?import javafx.geometry.Insets?> 6<?import javafx.scene.control.Button?> 7<?import javafx.scene.control.Label?> 8<?import javafx.scene.layout.VBox?> 9 10<VBox alignment="CENTER" depthTest="DISABLE" prefHeight="169.0" prefWidth="272.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MainController"> 11 <children> 12 <Label alignment="CENTER" contentDisplay="CENTER" prefHeight="17.0" prefWidth="176.0" text="テスト"> 13 <VBox.margin> 14 <Insets bottom="30.0" top="10.0" /> 15 </VBox.margin> 16 </Label> 17 <Button id="loginButton" fx:id="loginButton" alignment="CENTER" contentDisplay="CENTER" mnemonicParsing="false" onMouseClicked="#showLoginWindow" prefHeight="25.0" prefWidth="177.0" text="ログイン"> 18 <opaqueInsets> 19 <Insets /> 20 </opaqueInsets> 21 <VBox.margin> 22 <Insets bottom="10.0" top="10.0" /> 23 </VBox.margin> 24 </Button> 25 <Button fx:id="signupButton" alignment="CENTER" contentDisplay="CENTER" mnemonicParsing="false" onMouseClicked="#showSignupWindow" prefHeight="25.0" prefWidth="177.0" text="サインアップ"> 26 <VBox.margin> 27 <Insets top="10.0" /> 28 </VBox.margin> 29 </Button> 30 </children> 31 <opaqueInsets> 32 <Insets /> 33 </opaqueInsets> 34</VBox> 35
MainController.java
java
1 2import java.io.IOException; 3 4import javafx.fxml.FXML; 5import javafx.fxml.FXMLLoader; 6import javafx.scene.Scene; 7import javafx.scene.control.Button; 8import javafx.scene.layout.VBox; 9import javafx.stage.Stage; 10 11public class MainController { 12 13 @FXML 14 private Button loginButton; 15 16 @FXML 17 private Button signupButton; 18 19 @FXML 20 public void showLoginWindow() { 21 //System.out.println("this is showLoginWindow method"); 22 23 VBox root = null; 24 25 try { 26 root = FXMLLoader.load(getClass().getResource("./LoginWindow.fxml")); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 } 30 31 Stage stage = new Stage(); 32 stage.setScene(new Scene(root)); 33 stage.show(); 34 35 } 36 37 @FXML 38 public void showSignupWindow() { 39 System.out.println("this is showSingupWindow method"); 40 } 41 42} 43
LoginWindow.fxml
fxml
1 2<?xml version="1.0" encoding="UTF-8"?> 3 4<?import javafx.geometry.Insets?> 5<?import javafx.scene.control.Button?> 6<?import javafx.scene.control.Label?> 7<?import javafx.scene.control.PasswordField?> 8<?import javafx.scene.control.TextField?> 9<?import javafx.scene.layout.VBox?> 10<?import javafx.scene.text.Font?> 11 12<VBox fx:id="root" alignment="CENTER" prefHeight="259.0" prefWidth="367.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="LoginController"> 13 <children> 14 <Label text="ログイン"> 15 <font> 16 <Font size="28.0" /> 17 </font> 18 <VBox.margin> 19 <Insets bottom="20.0" top="20.0" /> 20 </VBox.margin> 21 </Label> 22 <Label alignment="CENTER" prefHeight="17.0" prefWidth="272.0" text="ユーザー名"> 23 <VBox.margin> 24 <Insets left="20.0" right="20.0" /> 25 </VBox.margin> 26 </Label> 27 <TextField fx:id="userNameField" onKeyPressed="#onKeyPressed"> 28 <VBox.margin> 29 <Insets bottom="10.0" left="40.0" right="40.0" top="10.0" /> 30 </VBox.margin> 31 </TextField> 32 <Label alignment="CENTER" prefHeight="17.0" prefWidth="252.0" text="パスワード"> 33 <VBox.margin> 34 <Insets left="20.0" right="20.0" /> 35 </VBox.margin> 36 </Label> 37 <PasswordField fx:id="passwordField" onKeyPressed="#onKeyPressed"> 38 <VBox.margin> 39 <Insets bottom="20.0" left="40.0" right="40.0" top="10.0" /> 40 </VBox.margin> 41 </PasswordField> 42 <Button fx:id="loginButton" disable="true" mnemonicParsing="false" onAction="#executeLogin" onKeyPressed="#onKeyPressed" prefHeight="25.0" prefWidth="338.0" text="ログイン"> 43 <VBox.margin> 44 <Insets bottom="20.0" left="40.0" right="40.0" /> 45 </VBox.margin> 46 </Button> 47 </children> 48 <opaqueInsets> 49 <Insets /> 50 </opaqueInsets> 51</VBox> 52
LoginController.java
java
1 2import static javafx.scene.input.KeyCode.*; 3 4import javafx.fxml.FXML; 5import javafx.scene.Node; 6import javafx.scene.control.Button; 7import javafx.scene.control.PasswordField; 8import javafx.scene.control.TextField; 9import javafx.scene.input.KeyEvent; 10import javafx.scene.layout.VBox; 11 12public class LoginController { 13 14 @FXML 15 VBox root; 16 17 @FXML 18 TextField userNameField; 19 20 @FXML 21 PasswordField passwordField; 22 23 @FXML 24 Button loginButton; 25 26 @FXML 27 public void onKeyPressed(KeyEvent e){ 28 29 Node source = (Node)e.getSource(); 30 31 if(e.getCode() == ESCAPE) { 32 closeWindow(); 33 } 34 35 if(source == userNameField) { 36 if(e.getCode() == ENTER) { 37 passwordField.requestFocus(); 38 } 39 }else if(source == passwordField) { 40 if(e.getCode() == ENTER) { 41 executeLogin(); 42 } 43 }else if(source == loginButton) { 44 if(e.getCode() == ENTER) { 45 executeLogin(); 46 } 47 } 48 49 if(isTextFieldEmpty(userNameField) && isTextFieldEmpty(passwordField)) { 50 loginButton.setDisable(false); 51 }else { 52 loginButton.setDisable(true); 53 } 54 55 } 56 57 private boolean isTextFieldEmpty(TextField field) { 58 if(field.getText() == null) { 59 return false; 60 } 61 if(field.getText().equals("")) { 62 return false; 63 } 64 return true; 65 } 66 67 @FXML 68 public void executeLogin() { 69 System.out.println("ログイン"); 70 } 71 72 @FXML 73 public void closeWindow() { 74 root.getScene().getWindow().hide(); 75 } 76 77} 78
開発環境
- widows
- eclipse
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/30 11:52