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

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

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

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

Java

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

Q&A

解決済

2回答

1733閲覧

JavaFXでのSwingにおけるCardLayoutのようなレイアウト

glat2238

総合スコア124

JavaFX

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

Java

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

0グッド

0クリップ

投稿2018/04/01 23:54

JavaFXで画面遷移を簡単に実現したいと思いSwingにあったCardLayoutのようなものを使いたいのですが
JavaFXにはCardPaneなんて物はなく困っています。
他にも画面遷移にはrootを入れ替えるだとかSceneを入れ替えるなどの方法があったのですが
CardLayoutのような一つのものしか表示されず、かつそれが簡単に切り替えられるようなPaneは実装できないでしょうか?StackPaneは子リストの順序によって順番が決まると聞いたのですが、それをうまく使えば行けそう…
と思ったところでリストの操作がうまくできません。
どなたか教えていただけないでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

StackPane, Groupなどいくつか方法がありますね。どちらを用いても大差ないですが、以下切り替え方法について少しコメントします。

CardLayoutの主な特徴は以下だと思います。

(A) 複数の子供を同じ位置にレイアウトする
(B) 一時に表示するのは一つの子供だけ
(C) 子供の切り替えはconstraintsを指定するだけで簡単に切り替わる

StackPane/Groupともに(A)の特徴をもってますが、(B)(C)は自前で行う必要があります。

StackPaneは子リストの順序によって順番が決まると聞いたのですが、それをうまく使えば行けそう…と思ったところでリストの操作がうまくできません。

さてStackPane/Groupの(A)の目的はどちらかといえば複数の子供を深度(子供を配置した順番)に応じて同時に表示するためという意味合いですので、深度を切り替えるだけでは(B)が確実に行えません。透明な背景を持つような子供があると奥にある別の子供が見えちゃいます。

そこで(B)(C)は「表示対象の子供以外をinvisibleにするという方針がよいと思います。若干めんどくさく感じるかも知れませんが、JavaFXのプロパティーとbindを用いるとそう面倒でもありません。CardLayoutでいうconstraintsをJavaFXプロパティーとして定義し、その値に応じて自動的に各々の子供のvisibleプロパティーを変化するようにbindしてやればよいです。

以下はその簡単な例です。

Java

1enum CardSwitch { 2 Card1, Card2 3} 4 5class SwitchPane<SW> extends StackPane { 6 // 切り替え用プロパティー 7 private ObjectProperty<SW> constraints = new SimpleObjectProperty<>(); 8 9 public ObjectProperty<SW> constraintsProperty() { return constraints; } 10 public SW getConstraints() { return constraintsProperty().get(); } 11 public void setConstraints(SW value) { constraintsProperty().set(value); } 12 13 // swingのContainer#add風のメソッド 14 public void add(Node child, SW constraint) { 15 //getChildren().remove(child);//冗長でした。 16 getChildren().add(child); 17 // constraintプロパティーの値が引数に指定したものと等しい場合のみvisibleにする 18 child.visibleProperty().bind(constraintsProperty().isEqualTo(constraint)); 19 } 20} 21 22public class SwitchPaneSample extends Application { 23 @Override 24 public void start(Stage stage) throws Exception { 25 SwitchPane<CardSwitch> switchPane = new SwitchPane<>(); 26 switchPane.add(new Label("CARD1"), CardSwitch.Card1); 27 switchPane.add(new Label("CARD2"), CardSwitch.Card2); 28 29 ChoiceBox<CardSwitch> choice = new ChoiceBox<>( 30 FXCollections.observableArrayList(CardSwitch.values())); 31 switchPane.constraintsProperty().bind(choice.valueProperty()); 32 33 VBox box = new VBox(choice, switchPane); 34 stage.setScene(new Scene(box, 250, 200)); 35 stage.show(); 36 } 37}

constraintsプロパティーへ値を設定しさえすれば必要な切り替えが自動的に行われます。
この例では簡単のためChoiceBoxで切り替えるようにしてます。


ちなみにCardLayoutとはUI的に差異がありますが、場合によってはTabPaneやPaginationのデザインにする選択肢もあると思います。

投稿2018/04/02 02:41

編集2018/04/02 02:56
KSwordOfHaste

総合スコア18394

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

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

glat2238

2018/04/02 02:53

ありがとうございます。
guest

0

https://teratail.com/questions/2556

によると StacPane がちかそうであるな
(回答以外見てないので使い方は聞かないこと)

投稿2018/04/02 00:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問