前提・実現したいこと
カスタムコントローラ方式を使い画面遷移を行っています。画面遷移をする際、遷移前の画面のsceneをスタック等を用いて格納し、「戻る」のボタンを押したら格納されたsceneをpopして表示するような方法を教えてください。
画面遷移の流れは以下のソースコードのようになっています。
[リンク内容]
カスタムコントローラ方式
(http://javafx-trick.appspot.com/article/110001/110009/80051.html)
該当のソースコード
「ぺ-ジ1→メイン」
window.getInstance().sendpage2("ページ2","おはよう");
「メイン→ページ2」
public void sendpage2(String label,String _text){
this.text = _text;
page2 controller = new page2(label,text);
this.replaceSceneContent(controller);
}
「シーンの変更」
private void replaceSceneContent(Parent controller) {
Scene scene = stage.getScene();
if (scene == null) {
scene = new Scene(controller);
stage.setScene(scene);
} else {
stage.getScene().setRoot(controller);
}
}
補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
訂正:
元の回答のプログラムは適当すぎました。push/popと画面の対応がおかしくなりますね(次の質問に上げておられるとおりです)失礼しました。
簡単に動かしてみたものを改めて掲げます。少々実装を変えてしまってますが雰囲気はつかんでいただけると思います。
// 以下はMainコントローラーとしてApplicationクラスの中に実装してしまってます。
public void showPage1(String text) {
pushContent(); // 現在の画面をpushしてから
replaceContent(new Page1(text)); // 新たな画面を表示する
}
public void showPage2(String text) {
pushContent();
replaceContent(new Page2(text));
}
Deque<Parent> stack = new ArrayDeque<>();
Stage stage;
// Applicationクラスのstartメソッドです
@Override
public void start(Stage stage) throws Exception{
this.stage = stage;
showPage1("page1");
stage.show();
}
// 現在表示中の画面をpush
public void pushContent() {
Scene sc = stage.getScene();
if (sc != null) {
Parent content = sc.getRoot();
assert content != null;
stack.addFirst(content);
}
}
// スタックから以前の画面をpopして表示
public void popContent() {
if (!stack.isEmpty()) {
Parent content = stack.removeFirst();
replaceContent(content);
}
}
// Sceneの表示内容を置き換える
void replaceContent(Parent content) {
Scene sc = stage.getScene();
if (sc == null) {
sc = new Scene(content);
stage.setScene(sc);
} else {
sc.setRoot(content);
}
}
一例を考えてみました。
(追記1:最初new Deque<>()としてました。すみません。new ArrayDeque<>()に変えました。
コンパイルしてないので他に間違いあったらご容赦を。)
(追記2:isEmpty()の判定が逆になってたので修正しました。)
class MainController {
//
Deque<Parent> contentStack = new ArrayDeque<>();
public void sendPage1(...) {
...
Page1 controller = Page1(...);
pushAndShowContent(controller); // 変更
}
public void sendpage2(String label, String _text){
this.text = _text;
Page2 controller = new Page2(label, text);
pushAndShowContent(controller); // 変更
}
// 新たな画面をpushして表示
void pushAndShowContent(Parent controller) {
contentStack.addFirst(controller);
replaceSceneContent(controller);
}
// 元の画面へ戻る(最初の画面だったら何もしない)
public void popAndShowContent() {
if (!contentStack.isEmpty()) {
replaceSceneContent(contentStack.removeFirst());
}
}
// 指定された画面を表示
private void replaceSceneContent(Parent controller) {
... 元の実装と同じ
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/03 20:19 編集
「Dequeはabstractです。インスタンスを生成することはできません」というエラーが出ました。
2017/02/03 20:24
ArrayDequeなどのコンクリートクラス(実体を直接生成できるクラス)を使ってみてください。
Deque<Parent> contentStack = new ArrayDeque<>();
2017/02/03 20:52
public void sendReturn(){
this.popAndShowContent();
}
ここはこのような感じでいいんでしょうか?
2017/02/03 21:04 編集
このようにしたら戻るようになったのですが、何回か戻ってると突然戻らなくなるという不備が起きました。原因がわかるならば教えていただけると。。。
2017/02/03 21:31
> 突然戻らなくなるという不備
それは実際のプログラムをデバッグしてみないとわからなそうです。デバッグした結果具体的な手がかりがわかり、かつそれが原因に結び付かないといった場合は別途質問を上げた方がよいと思います。
2017/02/03 22:21