如何在swing中使用Smack API停止打开重复窗口?

Har*_*Joy 7 java swing window smack

我有2个延伸课程JFrame.两者都有show()构造函数中的方法.从ClassOne我打电话ClassTwonew ClassTwo()按钮单击事件.但如果我再次按下按钮,ClassTwo则会打开新窗口.那么如果打开一个ClassTwo窗口,怎么能停止打开ClassTwo窗口呢?

编辑

现在这个问题已经解决,但现在当我第一次打开ClassTwo窗口时,它会显示一个窗口.然后关闭它后,当我再次打开ClassTwo窗口时,它打开两个窗口,这个计数继续增加.为什么会这样?

编辑2

我发现它不是摆动问题,而是来自MultickreChat类Samck API的问题.因此,任何曾经研究过它的人都会帮助我.

ClassOne中的代码是:

if(!winList.contains(room_jid)){
    new ClassTwo(room_jid,....);
    winList.add(room_jid);
}
Run Code Online (Sandbox Code Playgroud)

而在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();

}
Run Code Online (Sandbox Code Playgroud)

编辑3

classone的构造函数

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);
       }
     }
  });
}
Run Code Online (Sandbox Code Playgroud)

Kaj*_*Abt 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);
}
Run Code Online (Sandbox Code Playgroud)

您可以在按钮处理程序中使用其他答案的任意组合,例如切换功能或其他复杂的想法,例如单例。但最重要的是,您应该注意在按钮处理程序中创建一个新窗口,但在仅被调用一次的地方创建它。

编辑多个窗口和按钮。