JavaFXで画面遷移を簡単に実現したいと思いSwingにあったCardLayoutのようなものを使いたいのですが
JavaFXにはCardPaneなんて物はなく困っています。
他にも画面遷移にはrootを入れ替えるだとかSceneを入れ替えるなどの方法があったのですが
CardLayoutのような一つのものしか表示されず、かつそれが簡単に切り替えられるようなPaneは実装できないでしょうか?StackPaneは子リストの順序によって順番が決まると聞いたのですが、それをうまく使えば行けそう…
と思ったところでリストの操作がうまくできません。
どなたか教えていただけないでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア18394
0
https://teratail.com/questions/2556
によると StacPane がちかそうであるな
(回答以外見てないので使い方は聞かないこと)
投稿2018/04/02 00:02
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/02 02:53