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

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

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

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

Java

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

Q&A

解決済

1回答

1375閲覧

sceneとcontrollで同じイベントを登録している場合について

.Won

総合スコア66

JavaFX

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

Java

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

0グッド

0クリップ

投稿2016/12/14 09:06

javaFXでsceneとcontrollに同じイベントを登録していた場合sceneの方のみが起動します。

私はAnchorPaneにpolygonを入れ、両方のMouseClickedに処理を記入しています。
AnchorPane上でマウスをクリックした場合、AnchorPaneのイベントが起動します。
しかし、Polygon上でマウスをクリックしてもAnchorPaneのイベントが起動してしまいます。

これはどのようにすれば解決しますか

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

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

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

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

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

KSwordOfHaste

2016/12/14 12:00 編集

ハンドラーの登録処理はScene, PolygonともにsetOnMouseClicked(or FXML上のOn Mouse Clicked)でしょうか?
.Won

2016/12/15 08:18

SceneはFXML上で、PolygonはsetOnMouseClickedです
guest

回答1

0

ベストアンサー

非常に単純なサンプルを書いてみました。setOnMouseClicked(またはFXML上でOn Mouse Clicked)でハンドラーを登録していると仮定しています。以下のようにするとマウスクリックの場所によってそれぞれ期待通りのハンドラーが起動されるのが観察できると思います。

  • Polygon(黒い三角形)上でclickするとPolygonに対して発生
  • AnchorPane上のPolygon以外でclickするとAnchorPaneに対して発生
  • AnchorPane以外の場所(Label上など)でclickするとSceneに対して発生

さて、あなたのアプリケーションは何かが違っているはずです。それは何なのかご質問の内容からではわかりませんが下記のサンプルとの違いについて考えてみてください。
(下記はNode階層をハードコードしていますが、FXML上に記述しても同様の動作となります。)

java

1import javafx.application.Application; 2import javafx.scene.Scene; 3import javafx.scene.control.Label; 4import javafx.scene.input.MouseEvent; 5import javafx.scene.layout.AnchorPane; 6import javafx.scene.layout.VBox; 7import javafx.scene.shape.Polygon; 8import javafx.stage.Stage; 9//Scene 10// +- VBox 11// +- AnchorPane 12// | +- Polygon 13// +- Label 14public class MouseTest extends Application { 15 @Override 16 public void start(Stage primaryStage) throws Exception { 17 // Anchor生成 18 AnchorPane anchor = new AnchorPane(); 19 anchor.setOnMouseClicked(this::mouseClicked); 20 anchor.setPrefSize(200, 200); 21 // Polygon生成 22 double[] points = { 0, 0, 180, 0, 180, 180 }; 23 Polygon poly = new Polygon(points); 24 poly.setOnMouseClicked(this::mouseClicked); 25 AnchorPane.setTopAnchor(poly, 10.0); 26 AnchorPane.setLeftAnchor(poly, 10.0); 27 anchor.getChildren().add(poly); 28 // Label生成 29 Label label = new Label("LABEL"); 30 // VBox生成 31 VBox vbox = new VBox(anchor, label); 32 // Scene生成 33 Scene scene = new Scene(vbox); 34 scene.setOnMouseClicked(this::mouseClicked); 35 primaryStage.setScene(scene); 36 primaryStage.show(); 37 } 38 39 void mouseClicked(MouseEvent ev) { 40 System.out.printf("source = %s\n", ev.getSource()); 41 ev.consume(); 42 } 43 44 public static void main(String[] args) { 45 Application.launch(args); 46 } 47}

投稿2016/12/14 12:02

KSwordOfHaste

総合スコア18392

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

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

.Won

2016/12/15 08:22

見たところ、AnchorPaneとPolygonの両方で同時にイベントが起動していたために バグが発生していたそうです。 Polygon上でAnchorPaneのイベントを起動しない方法はありますか
KSwordOfHaste

2016/12/15 09:29

ev.consume()がポイントのようですね。イベントハンドラーは同時に起動されるのではなくて下位(この場合はPolygon)から上位へ向かって(AnchorPane->...->Sceneまで)順番に起動されるのです。ハンドラーで「上位Nodeではこのイベントに対するハンドラーを起動する必要はもうない」という場合ev.consume()をしてください。試しに私が挙げた例のmouseClickedメソッドの中にあるev.consumeの行をコメントアウトしてみてください。そうするとあなたのアプリケーションと同じ現象が起こることが観察できますよ。
.Won

2016/12/15 09:40

consume() を入れたら正しい処理を行いました ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問