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

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

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

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

Java

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

Q&A

解決済

2回答

6997閲覧

親ウィンドウを操作できる場合とそうでない場合があるのですが...

退会済みユーザー

退会済みユーザー

総合スコア0

JavaFX

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

Java

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

0グッド

0クリップ

投稿2016/08/29 11:15

###起こっていること
次のようなコードをかきました.

Java

1class KoWnd extends Stage { 2 3 public KoWnd(Window wnd){ 4 this.initOwner(wnd); 5 this.initModality(Modality.APPLICATION_MODAL); 6 this.setResizable(false); 7 this.setWidth(240); 8 this.setHeight(200); 9 this.setAlwaysOnTop(true); 10 11 Label lbl = new Label(); 12 lbl.setFont(new Font(24)); 13 lbl.setText("これは子ウィンドウ"); 14 15 Button btnClose = new Button("Close"); 16 btnClose.setPrefWidth(80); 17 btnClose.setOnAction(event -> this.close()); 18 19 VBox root = new VBox(); 20 root.setAlignment(Pos.CENTER); 21 root.getChildren().addAll(lbl,btnClose); 22 23 this.setScene(new Scene(root)); 24 } 25}

Java

1public class OyaWnd extends Application { 2 3 @Override 4 public void start(Stage stage) throws Exception { 5 6 Stage child= new KoWnd(stage); 7 child.show(); 8 9 stage.setTitle("Teratail"); 10 stage.setWidth(300); 11 stage.setHeight(250); 12 13 Label lblMsg = new Label("これは親ウィンドウ"); 14 lblMsg.setFont(new Font(30)); 15 16 Button btnChild = new Button("子ウィンドウを開く"); 17 btnChild.setOnAction(event -> child.show()); 18 19 Button btnOk = new Button("OK"); 20 btnOk.setPrefWidth(80); 21 btnOk.setOnAction(event -> stage.close()); 22 23 VBox root = new VBox(); 24 root.setAlignment(Pos.CENTER); 25 root.setPadding(new Insets(10,10,10,10)); 26 root.setSpacing(20); 27 root.getChildren().addAll(lblMsg,btnChild,btnOk); 28 29 stage.setScene(new Scene(root)); 30 stage.show(); 31 32 } 33}

ソースの初めのchild.show(); で子ウィンドウを表示したときは,親ウィンドウを操作することができますが,
btnChildでchild.show(); を呼び出した場合は,親ウィンドウを操作できません.

###質問
1.なぜ,同じchild.show();に違いが出ているのか.
2.一回目でも,意図的に親ウィンドウを操作できなくすることは可能か.
3.btnChildを押されたときに呼び出すchild.show(); でも意図的に親ウィンドウを操作できるようにすることは可能か.

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

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

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

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

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

guest

回答2

0

ベストアンサー

this.initModality(Modality.APPLICATION_MODAL);を設定していることがポイントです。

この処理についてAPIドキュメントの説明を見てみると、

javafx.stage.Modality - Java FX 8 API ドキュメント
https://docs.oracle.com/javase/jp/8/javafx/api/javafx/stage/Modality.html

他のアプリケーション・ウィンドウへのイベントの配信をブロックするモーダル・ウィンドウを定義します。

と書かれています。

モーダル・ウィンドウというのは詳しくは調べていただいくとして、
簡単に言うと子ウィンドウが出ているときは親ウィンドウを操作させない仕組みのことです。

以上を踏まえると、

1.なぜ,同じchild.show();に違いが出ているのか.

1回目は親が無いのでモーダル指定が利いていないからです。

2.一回目でも,意図的に親ウィンドウを操作できなくすることは可能か.

親を先に表示させれば1回目と2回目は同じようになります。

3.btnChildを押されたときに呼び出すchild.show(); でも意図的に親ウィンドウを操作できるようにすることは可能か.

モーダルにしている場合はできないと思います。

投稿2016/08/29 17:28

argius

総合スコア9390

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

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

退会済みユーザー

退会済みユーザー

2016/08/29 23:04

回答ありがとうございます. テキストに載っていたコードを映していたので,Modalityに関する理解が浅かったようです.
guest

0

自己解決しました.

stage.show(); ```を実行する前に子ウィンドウを

child.show();

stage.show();を実行した後に,child.show();で子ウィンドウを呼び出すと,親ウィンドウは操作できなくなります.

投稿2016/08/29 11:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/08/29 11:28

間違っていたら,訂正お願いします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問