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

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

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

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

Java

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

Q&A

解決済

1回答

1385閲覧

JavaFx ファンクションキーでボタンクリック時と同じイベントを実行させたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaFX

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

Java

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

0グッド

0クリップ

投稿2020/09/15 02:41

編集2020/09/28 07:13

前提・実現したいこと

タイトルの通りです。
マウスでボタンをクリックしてイベントを実行するのはSceneBuilderのOn Actionで追加していますが、
ファンクションキーで同一イベントを実行させたいときの処理が上手くできません。

試したこと

Scene追加部分に

java

1scene.setOnKeyPressed(e -> press(e));

KeyCodeのグローバル変数Keyに取得したキーを保存しています。

java

1public static void press(KeyEvent event) { 2 switch (event.getCode()) { 3 case F2: 4 event.getCode(); 5 Hensu.Key = event.getCode(); 6 System.out.println(event.getCode()); 7 break; 8 case F3: 9 event.getCode(); 10 Hensu.Key = event.getCode(); 11 System.out.println(event.getCode()); 12 break; 13 case F4: 14 event.getCode(); 15 Hensu.Key = event.getCode(); 16 System.out.println(event.getCode()); 17 break; 18 case F5: 19 event.getCode(); 20 Hensu.Key = event.getCode(); 21 System.out.println(event.getCode()); 22 break; 23 case F6: 24 event.getCode(); 25 Hensu.Key = event.getCode(); 26 System.out.println(event.getCode()); 27 break; 28 case F9: 29 event.getCode(); 30 Hensu.Key = event.getCode(); 31 System.out.println(event.getCode()); 32 break; 33 case ESCAPE: 34 event.getCode(); 35 Hensu.Key = event.getCode(); 36 System.out.println(event.getCode()); 37 break; 38 default: 39 break; 40 } 41 }

分からないこと

・変数で取得したあとの判定と実行のさせかた
・多数の画面遷移があるのでSceneの部分の追加は都度やらなければいけないのか

追記

java

1 void On_buttonF2Click(ActionEvent event) { 2     /* 3 * 新しい画面を生成する 4 */ 5 try { 6 Parent parent = FXMLLoader.load(getClass().getResource("Ndenpyo.fxml")); 7 Scene scene = new Scene(parent); 8 Stage stage = new Stage(); 9 KANRIMENUController controller = scene.<KANRIMENUController>getController(); 10 scene.getAccelerators().put(KeyCodeCombination.valueOf("F2"), () -> controller.buttonF2.fire()); 11 stage.setScene(scene); 12 stage.setTitle("一覧"); 13 stage.show(); 14 15 16 }catch(IOException e) { 17 e.printStackTrace(); 18 } 19}

###追記2

java

1try { 2 FXMLLoader loader = new FXMLLoader(getClass().getResource("Ndenpyo.fxml")); 3 Parent parent = loader.load(); 4 Scene scene = new Scene(parent); 5 Stage stage = new Stage(); 6 KANRIMENUController controller = loader.<KANRIMENUController>getController(); 7 scene.getAccelerators().put(KeyCodeCombination.valueOf("F2"), () ->controller.buttonF2.fire()); 8 stage.setScene(scene); 9 stage.setTitle("一覧"); 10 stage.show(); 11 12 13 }catch(IOException e) { 14 e.printStackTrace(); 15 }

###コンソール

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1787) at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1670) at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) at javafx.base/javafx.event.Event.fireEvent(Event.java:198) at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8879) at javafx.controls/javafx.scene.control.ToggleButton.fire(ToggleButton.java:257) at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:206) at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274) at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.base/javafx.event.Event.fireEvent(Event.java:198) at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3851) at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1200(Scene.java:3579) at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1849) at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2588) at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397) at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390) at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433) at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556) at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76) at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273) at com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83) at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1782) ... 47 more Caused by: java.lang.ClassCastException: class application.Ndenpyo cannot be cast to class application.KANRIMENUController (application.Ndenpyo and application.KANRIMENUController are in unnamed module of loader 'app') at application.KANRIMENUController.On_buttonF2Click(KANRIMENUController.java:97) ... 58 more

###追記3

java

1 FXMLLoader loader = new FXMLLoader(getClass().getResource("KANRIMENU.fxml")); //KANRIMENU→例で行くとmain 2 Parent parent = loader.load(); 3 Scene scene = new Scene(parent); 4 KANRIMENUController controller = loader.<KANRIMENUController>getController(); 5 scene.getAccelerators().put(KeyCodeCombination.valueOf("ESCAPE"), () -> controller.buttonEsc.fire()); //ここで指定するボタンは例で行くとappの画面にあるものです 6 7 Stage stage = new Stage(); 8 stage.setScene(scene); 9 stage.setTitle("メインメニュー");//メインメニューは例で行くとappです 10 stage.show();

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

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

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

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

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

guest

回答1

0

ベストアンサー

アクセラレータがいいんじゃないでしょうか。
シーンが複数ある場合は、おそらくシーンごとに設定するしかなさそうです。

Java::App.java

1package sample; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Parent; 6import javafx.scene.Scene; 7import javafx.scene.input.KeyCodeCombination; 8import javafx.stage.Stage; 9 10public class App extends Application { 11 @Override 12 public void start(Stage primaryStage) throws Exception { 13 FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml")); 14 Parent parent = loader.load(); 15 Scene scene = new Scene(parent); 16 MainController controller = loader.<MainController>getController(); 17 scene.getAccelerators().put(KeyCodeCombination.valueOf("F2"), () -> controller.button.fire()); 18 primaryStage.setScene(scene); 19 primaryStage.setTitle("メイン"); 20 primaryStage.show(); 21 } 22 23 public static void main(String[] args) { launch(args); } 24}

xml:main.fxml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.Button?> 4<?import javafx.scene.layout.BorderPane?> 5 6<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" 7 prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" 8 fx:controller="sample.MainController"> 9 <center> 10 <Button fx:id="button" mnemonicParsing="false" onAction="#onButtonClick" text="サブへ" 11 BorderPane.alignment="CENTER"/> 12 </center> 13</BorderPane>

Java:MainController.java

1package sample; 2 3import javafx.event.ActionEvent; 4import javafx.fxml.FXML; 5import javafx.fxml.FXMLLoader; 6import javafx.scene.Node; 7import javafx.scene.Parent; 8import javafx.scene.Scene; 9import javafx.scene.control.Button; 10import javafx.scene.input.KeyCodeCombination; 11import javafx.stage.Stage; 12import javafx.stage.Window; 13 14public class MainController { 15 @FXML 16 Button button; 17 18 @FXML 19 protected void onButtonClick(ActionEvent evt) throws Exception { 20 Scene s = ((Node) evt.getSource()).getScene(); 21 Window w = s.getWindow(); 22 w.hide(); 23 24 FXMLLoader loader = new FXMLLoader(getClass().getResource("sub.fxml")); 25 Parent parent = loader.load(); 26 Scene scene = new Scene(parent); 27 SubController controller = loader.<SubController>getController(); 28 scene.getAccelerators().put(KeyCodeCombination.valueOf("F2"), () -> controller.button.fire()); 29 Stage stage = new Stage(); 30 stage.setScene(scene); 31 stage.setTitle("サブ"); 32 stage.show(); 33 } 34}

xml:sub.fxml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.Button?> 4<?import javafx.scene.layout.BorderPane?> 5 6<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" 7 prefWidth="400.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" 8 fx:controller="sample.SubController"> 9 <center> 10 <Button fx:id="button" mnemonicParsing="false" onAction="#onButtonClick" text="メインへ" 11 BorderPane.alignment="CENTER"/> 12 </center> 13</BorderPane>

Java:SubController.java

1package sample; 2 3import java.io.IOException; 4 5import javafx.event.ActionEvent; 6import javafx.fxml.FXML; 7import javafx.fxml.FXMLLoader; 8import javafx.scene.Node; 9import javafx.scene.Parent; 10import javafx.scene.Scene; 11import javafx.scene.control.Button; 12import javafx.scene.input.KeyCodeCombination; 13import javafx.stage.Stage; 14import javafx.stage.Window; 15 16public class SubController { 17 @FXML 18 Button button; 19 20 @FXML 21 protected void onButtonClick(ActionEvent evt) throws IOException { 22 Scene s = ((Node) evt.getSource()).getScene(); 23 Window w = s.getWindow(); 24 w.hide(); 25 26 FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml")); 27 Parent parent = loader.load(); 28 Scene scene = new Scene(parent); 29 MainController controller = loader.<MainController>getController(); 30 scene.getAccelerators().put(KeyCodeCombination.valueOf("F2"), () -> controller.button.fire()); 31 Stage stage = new Stage(); 32 stage.setScene(scene); 33 stage.setTitle("メイン"); 34 stage.show(); 35 } 36}

投稿2020/09/15 09:37

編集2023/07/23 05:52
TN8001

総合スコア9321

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

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

退会済みユーザー

退会済みユーザー

2020/09/16 01:14

ご回答ありがとうございます。参考に追記のようにしてみました! しかしgetControllerでメソッド getController() は型 Scene で未定義ですというエラーが出てしまいます。どこが間違っているのでしょうか・・・初心者の質問で申し訳ありません。
TN8001

2020/09/16 01:32

ややこしいのでよく見比べてください。getControllerはFXMLLoaderのメソッドです。 見にくいですが、追記コードに合わせるとこうです。 FXMLLoader loader = new FXMLLoader(getClass().getResource("Ndenpyo.fxml")); Parent parent = loader.load(); Scene scene = new Scene(parent); Stage stage = new Stage(); KANRIMENUController controller = loader.<KANRIMENUController>getController(); scene.getAccelerators().put(KeyCodeCombination.valueOf("F2"), () -> controller.buttonF2.fire());
退会済みユーザー

退会済みユーザー

2020/09/16 01:45

コードありがとうございます。試してみました!しかしコンソールに上記の表示が出てしまいます。 画面遷移がボタンクリックイベント内で行っていて、現在の画面を消す→新しく生成するという流れでボタンクリックイベント内に回答していただいたコードを追加しています。それでも大丈夫なのでしょうか?
TN8001

2020/09/16 04:22

2ウィンドウで書き直しました(メイン<ー>サブ) こちらでは特に問題なく遷移しました。 アクセラレータの設定が相手側になってしまうのが非常に気持ち悪いです^^; が、initialize時にはSceneが取れないため、単純に書くとこうせざるを得ません。。。
退会済みユーザー

退会済みユーザー

2020/09/16 07:22

ありがとうございます!!おかげでF2の部分は動くようになりましたが、設定方法が複雑で理解できておらず、まだ完成まで到達できていません・・・。今はF2の一方通行になってしまっています・・・。少し時間がかかりそうなので自分で試行錯誤しつつ、もし何かわからないことがあったらこちらで質問させていただいてよろしいでしょうか・・・?
TN8001

2020/09/16 07:57

> 今はF2の一方通行になってしまっています・・・。 回答コードは * メインウィンドウでボタンを押すかF2で、サブウィンドウに遷移 * サブウィンドウでボタンを押すかF2で、メインウィンドウに遷移 ですが、「F2の一方通行」の意味がよくわからないです。 ボタンクリックで双方向?にはなっているんでしょうか? > もし何かわからないことがあったらこちらで質問させていただいてよろしいでしょうか 回答コードに関する疑問でしたらいつでもどうぞ。 あまりにも質問内容と離れる場合は、新たに質問を立ててもらったほうがいいと思います。
退会済みユーザー

退会済みユーザー

2020/09/17 06:09

今、TN8001様の例でいくと、appにmainへ行くコードがあり、mainにsubへ行くコードがあり、subにmainに行くコードがあると思うのですが、私の場合appにmainへ行くコード、mainにsubへ行くコード、subにendに行くコードがあり、endにはESCキーを押したらsubに戻る処理ができるコードを書きたいです。同じようにESCキーを押したらsubからmainに行くコード、mainからappへ戻ってきたいです・・・。 ボタンクリックでは画面遷移は希望通り動いています!
退会済みユーザー

退会済みユーザー

2020/09/17 06:12

追記3に戻りたい部分のボタンイベントに追加したコードを追記しました!よろしくお願いいたします。
TN8001

2020/09/17 08:45

JavaFXはあまり詳しくないのですが、fxmlとControllerは基本1対1の関係ですよね? エラー文を見る限りControllerの型があっていないような気がします。 追記2のコードではNdenpyo.fxmlに対し、KANRIMENUControllerとなっています。 追記3のコードではKANRIMENU.fxmlに対し、KANRIMENUControllerとなっています。 どちらが正しいのかわかりませんが、なんにしろ齟齬があるように思います。 階層が何段になってもやることは同じです(3段に書き直すのはやぶさかでないですが、1万字を超え投稿できない気がします^^; ウィンドウを出すとき(Appのstartでも各ControllerのonButtonClickでも)に、 * 出したいfxmlを読む * 対応するControllerを取得する * SceneにAcceleratorを追加しControllerの処理を呼ぶ(button.fire) * showする つまり class Appでは、loader.<MainController>getControllerになるはずで、 class MainControllerでは、loader.<SubController>getControllerになるはずで、 class SubControllerでは、loader.<EndController>getControllerになるはずです。 このあたりを注意深く見直してみてください^^
退会済みユーザー

退会済みユーザー

2020/09/18 01:18 編集

何度も丁寧に教えていただきありがとうございます・・・ 申し訳ないのですが分からないところがあります。 Main(F2イベント内)にsubのF2コントローラーを設定するとsubのF2イベント(Endの表示)が呼び出されてsubでF2を押すとEndが表示されます。ここまでは希望通りの動きなのでいいのですが、Main→EndなのでSub(F2)にはただの表示コードしか書かれていません。それは正しいことなのでしょうか・・・? また、今回戻るボタンは全てESCAPEにしてありますがEndからSubに戻りたいときにはEnd(Escイベント内)にSubのどのコントロールを指定すればよいのですか?SubのEscイベントだとMainに戻ります。 今はEnd(Escイベント内)にSubのEscコントローラーを設定しています。MainにはEscイベントはあるものの、プログラムの完全終了用なので、F2のイベント内にESCAPEを取得するコードを追加してみました。 F2と全く逆の動きをしたいだけなのですが、何度試しても動きが分からず、反応もしません。そもそも対応するコントロールはESCAPEであっているのでしょうか・・・ F2の流れは理解できましたが逆になるとどうも分からなくなります 読みづらく、申し訳ありません。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2020/09/18 04:23

追加で申し訳ありません!ESCAPE以外のキーはTN8001様のおかげで全て希望通り動くようになりました・・・本当にありがとうございます!! ですがやはりESCAPEだけ判定してもらえず、無反応な状態です・・・ ご教授お願いします;;
退会済みユーザー

退会済みユーザー

2020/09/18 07:43

追加で申し訳ないです!!ESCAPEはEscで通りました・・・ ありがとうございました。本当に助かりました。
TN8001

2020/09/18 07:58

んと目的通り動いたってことでいいんですか? 3段版もちまちま書いていたんですがもういいですね^^;
退会済みユーザー

退会済みユーザー

2020/09/23 07:05

お手数おかけしてしまい申し訳ありませんでした・・・;; TN8001様のおかげで希望通りになりました!! 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問