7

拡張する2つのスイングクラスがありますJFrame。どちらshow()もコンストラクターにメソッドがあります。ClassOne私からボタンクリックイベントClassTwoのようなものを呼び出しました。new ClassTwo()しかし、ボタンをもう一度押すと、新しいウィンドウClassTwoが開きます。ClassTwoウィンドウが1つ開いている場合、ClassTwoウィンドウを開くのを止めるにはどうすればよいですか?

編集

この問題は解決されましたが、ClassTwo ウィンドウを最初に開いたときに 1 つのウィンドウが表示されます。次に、ClassTwoウィンドウを再度開いたときに閉じた後、2つのウィンドウが開き、このカウントは増加し続けます。なぜこれが起こっているのですか?

編集2

これはスイングの問題ではなく、Samck API の MultiUsreChat クラスの問題であることがわかりました。だから、それに取り組んだ人は誰でも私を助けてください。

ClassOne のコードは次のとおりです。

if(!winList.contains(room_jid)){
    new ClassTwo(room_jid,....);
    winList.add(room_jid);
}

ClassTwo は次のとおりです。

public ClassTwo(....){
......
    this.muc = new MultiUserChat(connection, room_jid);
    if(!muc.isJoined())
        muc.join(this.user_id);      //---- This line opens previously closed window.
.....

    if(!isVisible())
       show();

}

編集 3

クラスワンのコンストラクタ

public ClassOne(){
  JButton btn = new JButton("Open");
  btn.addActionListener(new ActionListener(){
     public void actionPerformed(ActionEvent e){
       if(!winList.contains(room_jid)){
           new ClassTwo(room_jid,....);
            winList.add(room_jid);
       }
     }
  });
}
4

4 に答える 4

4

ClassTwoコンストラクターでフレームを表示しないでください。代わりに、classOneにclassTwoへの参照を保持し、ボタンがクリックされたときに、次のように表示します。

//on button click
if(classTwo == null){
    classTwo = new ClassTwo();
}
classTwo.setVisible(true);

また、classTwoのデフォルトのクローズ操作を、終了ではなくクローズ時に非表示に変更します。

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

つまり、ボタンが何回クリックされても、既存のインスタンスを表示するだけなので、問題はありません。新しいインスタンスは作成されません。

于 2011-02-02T12:55:58.933 に答える
3

で、を使用ClassOneして新しいものを開いたかどうかを簡単に思い出すことができます。ClassTwoboolean

//in event handler for the button
if (!classTwoShown)
{
  classTwoShown = true;
  new ClassTwo();
}

また、クラス2のdisposeイベントにフックして、classTwoShownフラグをリセットする必要があります。

于 2011-02-02T12:57:38.457 に答える
2

シングルトンパターンを使ってみる

于 2011-02-10T13:09:58.343 に答える
0

これが機能しない理由は、ボタン ハンドラー内で ClassTwo の新しいインスタンスを作成しているためです。つまり、ボタンが押されるたびに新しいウィンドウが作成されます。これはうまくいくはずです:

private Map<JButton, ClassTwo> classTwoMap;

public ClassOne(){
  classTwoMap = new HashMap<JButton, ClassTwo>();
  ClassTwo bn1window = new ClassTwo();
  bn1window .setVisible(false);
  //initialisation code for your window
  .....
  JButton btn = new JButton("Open");
  btn.addActionListener(new ActionListener(){
     public void actionPerformed(ActionEvent e){
        classTwoMap.Get(e.getSource()).setVisible(true);
     }
  });

  classTwoMap.Get(btn).setvisible(false);
}

//Edit:
public ClassTwo() {
    // This will hide the window when closed, and the button will re-"open" it.
    setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}

トグル機能やその他の複雑なアイデア (シングルトンなど) など、ボタン ハンドラー内で他の回答を自由に組み合わせて使用​​できます。ただし、重要なことは、ボタン ハンドラーで新しいウィンドウを作成することに注意する必要がありますが、一度だけ呼び出される場所に作成することです。

複数のウィンドウとボタン用に編集。

于 2011-02-14T14:32:15.920 に答える