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

Java 如何在swing中使用Smack API停止打开重复窗口?,java,swing,window,smack,Java,Swing,Window,Smack,我有两个swing类,它们扩展了JFrame。这两个构造函数中都有show()方法。从ClassOne我调用了ClassTwo类似于newclasstwo()的按钮点击事件。但是如果我再次按下按钮,ClassTwo的新窗口将打开。那个么,若有一个ClassTwo窗口被打开,我怎么能停止打开ClassTwo窗口呢 编辑 现在这个问题解决了,但现在当我第一次打开ClassTwo窗口时,它显示了一个窗口。然后在关闭它之后,当我再次打开Class2窗口时,它打开了两个窗口,并且这个计数继续增加。为什么会

我有两个swing类,它们扩展了
JFrame
。这两个构造函数中都有
show()
方法。从
ClassOne
我调用了
ClassTwo
类似于
newclasstwo()
的按钮点击事件。但是如果我再次按下按钮,
ClassTwo
的新窗口将打开。那个么,若有一个ClassTwo窗口被打开,我怎么能停止打开ClassTwo窗口呢

编辑


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

编辑2

我发现这不是swing问题,而是SamckAPI的MultiUsreChat类的问题。所以任何参与过这项工作的人都可以帮助我

ClassOne中的代码是:

if(!winList.contains(room_jid)){
    new ClassTwo(room_jid,....);
    winList.add(room_jid);
}
第二类是:

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);
       }
     }
  });
}

不要让框架在ClassTwo构造函数中可见。相反,在classOne中保留对Class2的引用,当单击按钮时,使其可见,如下所示:

//on button click
if(classTwo == null){
    classTwo = new ClassTwo();
}
classTwo.setVisible(true);
还将classTwo的默认关闭操作更改为关闭时隐藏,而不是退出:

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

因此,按钮被单击多少次并不重要,因为它所做的只是使现有实例可见。它不会创建新实例。

ClassOne
中,您只需记住是否使用
布尔值打开了新的
ClassTwo

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

您还应该钩住类2的dispose事件来重置
ClassTwoShowed
标志。

尝试使用singleton模式它不起作用的原因是您正在按钮处理程序中创建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);
}
私有地图classTwoMap;
公共一级(){
classTwoMap=newHashMap();
ClassTwo bn1window=新的ClassTwo();
bn1window.setVisible(假);
//窗口的初始化代码
.....
JButton btn=新JButton(“打开”);
btn.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
Get(e.getSource()).setVisible(true);
}
});
classTwoMap.Get(btn).setvisible(false);
}
//编辑:
公共类别二(){
//这将隐藏窗口关闭时,按钮将重新“打开”它。
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}
您可以在按钮处理程序中使用其他答案的任意组合,例如切换功能或其他复杂想法,例如单例。但最重要的是,您应该注意在按钮处理程序中创建一个新窗口,但是在只调用一次的地方创建它


为多个窗口和按钮编辑。

此问题已解决,但现在当我第一次打开ClassTwo窗口时,它显示一个窗口。然后在关闭它之后,当我再次打开Class2窗口时,它打开了两个窗口,并且这个计数继续增加。为什么会发生这种情况?编辑2无法解释如何打开窗口。我相信您仍在某处创建ClassTwo窗口的新实例。仅在ClassOne的构造函数中创建一个实例,然后在按钮中设置其可见性+1到dogbane。@Kdansky:我添加了完整的代码部分,在其中我调用了Class2。第二类打开以前关闭的窗口。但如果你愿意,我可以分享我的完整代码???源代码中缺少:按钮处理程序和ClassOne的构造函数。哪两部分是我感兴趣的。@Kdansky:我已经用classone的构造函数源更新了我的问题。看一看
用@Harry回复我,这样即使我不在这个问题中,我也能得到你的回复。
你能解释更多原因吗?我不知道单吨模式。@Kdansky:这个解决方案对我没有用,因为我想同时打开多个ClassTwo窗口。所以我每次点击按钮时都要创建一个新的实例。你们写了“那个么,若有一个ClassTwo窗口被打开,我怎么才能停止打开ClassTwo窗口呢?”。请澄清。@Kdansky:解决的是我的问题,但下一个问题是打开以前关闭的窗口。查看我的
编辑
@Harry:查看我的编辑。更改classtwo的构造函数,使窗口永远不会被破坏,而只被隐藏。@Kdansky:+1,如果只有一个按钮螺母,您的解决方案将解决问题。在我的例子中,按钮的数量是动态的。所以,如果我这样做,那么我还必须维护隐藏的已打开窗口的列表或地图。你知道我该怎么做吗?