2012-04-02 11 views
3

フレームを開くボタンがあります。フレームが開いているかどうかに応じてボタンを有効/無効にする方法はありますか?フレームが開いているかどうかに基づいてボタンを有効または無効にする

フレームが開いている場合、ボタンをbutton.enabled(false)にしたいとします。しかし、フレームが閉じられるとすぐに、button.enabled(true)に変更したいと思います。私はこの

JFrame testFrame = new JFrame(); 
testFrame.setSize(100,100); 
testFrame.setVisible(true); 

は、しかし、私は一度にこれらのフレームを複数開くことをしたくないんボタンの私のactionPerformedメソッドで

。したがって、ボタンのクリックによって作成されたフレームが開いている間、フレームが閉じられるまでボタンを無効にします。

+0

フレーム? http://www.w3.org/TR/html4/present/frames.htmlのように?これがあなたが得意であれば、私は他の方法を完全に使用することを強くお勧めします。 – Andrew

+1

オープンを定義しますか?ウィンドウが作成されたのか、開いているのかを意味しますか?たとえば、JFrameを作成することはできますが、それを表示することはできません.JFrameを起動することもできますが、最小化することはできますか? –

+1

これはAWT、Swing、Android、別のGUIライブラリですか?これは重要な情報であり、正解がすべきものを変更します。 –

答えて

3

あなたはおそらく別のGUIからのJFrameとして依存ウィンドウを開くべきではありません。モーダルまたは非モーダルのJDialogやJOptionPaneなどのダイアログを開くほうがはるかに良いでしょう。これらの2つの生徒のいずれかが非常に複雑なGUIを保持できることをご理解ください。例えば、ここで例を見てください:how-do-you-return-a-value-from-a-java-swing-window-closes-from-a-button

また、あなたのダイアログ変数があなたのクラスのフィールドであれば、そのフィールドは一度しか作成されず、ボタンが1つでも作成されます表示するには複数回押します。以下のようになります

あなたのコード...

// testDialog is a JDialog field. and this line is called in 
// the class constructor. 
JDialog testDialog = new JDialog(theCurrentJFrame, "Dialog Title", false); // true 
                    // if modal 

// this line is called in the button's ActionListener. 
testDialog.pack(); // Never set the size of your GUI's. 
        // Let the layout managers do this for you. 
testDialog.setVisible(true); 
+0

JFrameの情報を利用する予定がないのではないかと心配していますか? (表示のためだけのものです)。また、私がupvoteへの十分な担当者を取得するとすぐに、私は戻ってあなたにリンクして答えをupvotingされます。 (そしてパックメソッドについてのおしゃべりに感謝します - 新しいここにスイングする:) – WilliamShatner

+0

このウィンドウにメインGUIの上に常に*表示する場合は、非モーダルダイアログでなければなりません。ウィンドウが1つしか存在しないようにするには、actionPerformedメソッドのローカル変数ではなく、クラスのフィールドにします。 –

+0

アドバイスをいただき、ありがとうございます。私はJDialogオプションを探求しようとしています(既にdann.devの例を試しました)。あなたが私に尋ねる気にならないなら、なぜJDrameをJFrameよりも優れたオプションにするのですか?これらのダイアログにもテーブルを保持できますか?あなたの例を見ると、彼らは多くのことができるようです。 – WilliamShatner

3

ユーザー(またはプログラム)がフレームを閉じるときにボタンを有効にするonCloseリスナーを追加します。フレームが表示されない場合でも、私はまだフレームを表示しません。同様に、最初にフレームを開く通話中のボタンを無効にする行を追加します。あなたの意図は、単一のウィンドウを作成ボタンを持っているのであれば

+0

これはこれを行うべき方法だと思いますが、どうやって行うのか分かりません。私はリスナーの仕組みについてちょっと混乱しています。フレームリスナーをフレームに追加してからwindowclosingをオーバーライドしたいですか? – WilliamShatner

+0

私はすでに質問の答えを選んでいますが、あなたがそれを提供したいのであれば、あなたの答えにはまだ興味があります! – WilliamShatner

+0

残念ながら、間違ったライブラリを推測し、スイングでこれを行う方法はわかりませんが、[http://stackoverflow.com/questions/7650990/java-jframe-intercept-exit-on-close-to-save-data ](http://stackoverflow.com/questions/7650990/java-jframe-intercept-exit-on-close-to-save-data)が役立つかもしれません。 – Thomas

3

、私はというし、ボタンを有効化、無効化を示唆している、あなたはクラス変数を持っている、それはあなたのコードではそうどこかで、単一のJFrameを指すがあります。

JFrame myFrame = null; 

そして、ボタンのコードは次のようになります。

If (myFrame == null) { 
    myframe = new JFrame(); 
    //set up the frame etc 
    myFrame.setVisible(); 
} else { 
    myFrame.setVisible(); 
    //code to bring focus to myFrame 
} 

正直に言うと、私はかなりの数のリンクウィンドウにフォーカスを移動するための最良の方法を覚えているが、ここにいることはできません。

How to bring a window to the front?
http://coding.derkeiler.com/Archive/Java/comp.lang.java.gui/2006-06/msg00152.html

+0

私は、コンポーネントの焦点についてあまり心配していません。むしろ、コンポーネントを複数回作成できるようにするつもりはありません。しかし、いったんコンポーネントが閉じられると、ユーザーはそれを開いて開くことができます。 – WilliamShatner

+0

情報をそこに保存しますか?またはポップアップする新しいもの? –

+0

ポップアップするだけの新しいもの。 (ボタンをクリックするたびに文字列と乱数が表示されますが、実際には保存する必要はありません。学習目的のために多くあります) – WilliamShatner

関連する問題