Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

現在開いている画面をすべて閉じて、特定の画面だけを開きたい。

【Swingアプリでの無操作時間の判定は?】の続きで、質問とタイトルが異なるので別スレさせていただきました。

N個の画面が開いている状態で、【ログイン】ボタンをクリックしたら、全画面を閉じてログイン画面だけを表示したいのですが・・・はまっています。


・画面の遷移はログイン → メニュー → 各画面 → 詳細画面
・最初にログイン画面で認証した後に、ログイン画面を閉じてメニューを開きます。
・メニューは常に開いた状態で、各画面と詳細画面を開きます。
・各画面や各詳細画面の数に制限はありません。
・すべての画面に【ログイン】ボタンを配置し、クリックしたら全画面を閉じる
・閉じるときにログイン画面を表示する(その際、パラメータを渡す)

上記を1つのメソッドで実現したいのですがはまっています。ログイン画面を開くのはいいのですが、全ての画面を閉じる作業がどうしていいか分かりません。
個々のオープンしている画面をどこかに格納していて・・・という方法もあるかと思いますが、できればその辺りを意識しないですむ方法があればと思っています。
スレッドとか使えばと思って試してみたのですが、やはりSystem.exit(0)を実行した時点で終了してしまいます。
何かJavaの命令でオープン中の画面(JFrame,JDialog)を取得してDispose()できる方法はありますでしょうか?

よろしくお願いします。

if  (NowTimeOut < 0)    {
    JOptionPane.showMessageDialog(null, "タイムアウトです。);
    Runnable runner = new TimeOutCheckRunner();
    Thread t = new Thread(runner);
    t.start();
    new login.Login(inMap.get("ProjectSeq")).setVisible(true);
}

 class  TimeOutCheckRunner implements Runnable  {
     public void run()  {
        try {
            Thread.sleep(1000);
            System.exit(0);

        } catch (NumberFormatException ex) {
            ex.printStackTrace();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

8

回答

85492

閲覧

8件の回答

評価

0

あなたのアプリに現状では各現場オブジェクトはあるけどメインコントローラオブジェクト(オブジェクトデスパッチャー)がないから…。

評価

0

>スレッドとか使えばと思って試してみたのですが、やはりSystem.exit(0)を実行した時点で終了してしまいます。
なぜ、System.exit()何ですか?
System.exit()なら、VMが停止して当然ですよね。

>何かJavaの命令でオープン中の画面(JFrame,JDialog)を取得してDispose()できる方法はありますでしょうか?
実装方法はともかく、これについては、とりあえずjava.awt.Windowとjava.awt.Frameのjavadocを読んでみてください。

単に読み取れていないだけかもしれませんが、そんなに難しくないように思います。想像では、多分30分くらいで大枠は実装できるのではないでしょうか?

例えば、仮にログイン状態を"Session"と呼ぶとして。

1.SessionEvent,SessionListenerとかイベント、イベントリスナーインタフェイスを作成。

2.セッション管理モデルインタフェイス、実装モデル作成。セッション管理モデル内で、AWTListenerやEventQueueで無操作状態を判定。

3.SessionListenerを実装したインスタンスの作成ファクトリクラス作成。この中で、SessionListenerを実装したインスタンスを生成。

4.セッション管理モデル内でタイムアウトを検知したら、
SessionListenerにタイムアウトSessionEventを送信。

5.タイムアウトSessionEventを受信したSessionListener実装インスタンスが受動的にウィンドウをdispose()。

6.ログイン画面表示。

以上

評価

0

rancoさん、fooさん回答ありがとうございます。

fooさん、詳細な情報ありがとうございます。
理解しきれていない部分がありますが、キーワードを調べながらやってみます。
とりあえず、java.awt.Windowとjava.awt.Frameを調査してみます。
ありがとうございました。

評価

0

なんか不本意ですが、意図したことができてしまいました。なぜ、MainMenu.getWindows()で全Windowが取得できるのかJavadoc見たけど今ひとつ納得できません。
でもこれでdispose()すると、期待した結果になりました。

Javadoc曰く、
「オーナーがいるかどうかにかかわらず、このアプリケーションによって作成されたすべての Window の配列を返します。」とありました。

みなさんありがとうございました。

if  (NowTimeOut < 0)    {
    JOptionPane.showMessageDialog(null, "タイムアウトです。\nログインしなおしてください。");
    java.awt.Window[] win = form.menu.MainMenu.getWindows();
    String projectSeq = inMap.get("ProjectSeq");
    for (int i = 0; i < win.length; i++)    {
        win[i].dispose();
    }
    new form.login.Login(projectSeq).setVisible(true);
}

評価

0

> getWindows()
はぁ、Java 6にはこんな子も隠れていましたか。

でも、アプリケーションの構造がふつうなら、すべてのウィンドウをアプリケーションのメイン部分が自然に把握しているはずですよ。

評価

0

rancoさんおはようございます。

>でも、アプリケーションの構造がふつうなら、すべてのウィンドウをアプリケーションのメイン部分が自然に把握しているはずですよ。

これは、どの画面を開くときでもどこか1箇所のクラスで集中管理するのが望ましいということでしょうか?
すいません、一人で開発していてそのあたりの手法がよくわからないので。

評価

0

> 集中管理するのが望ましい
そんな硬い話ではなくて、すなおで自然なトップダウンの設計なら、自然にそういう構造になる、という話です。

つぎつぎといろんなものを、要求が増えるたびにつぎはぎしていった「無設計」なアプリは、手遅れにならないうちにリファクタリングすべきです。思い切って!。

評価

0

>つぎつぎといろんなものを、要求が増えるたびにつぎはぎしていった「無設計」なアプリは、手遅れにならないうちにリファクタリングすべきです。思い切って!。

了解です、回答ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。