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

时间:2011-02-02 12:50:34

标签: java swing window smack

我有两个扩展类JFrame。两者都有构造函数中的show()方法。来自ClassOne我在按钮点击事件中调用ClassTwo,如new ClassTwo()。但如果我再次按下按钮,则会打开ClassTwo的新窗口。那么如果打开一个ClassTwo窗口,怎么能停止打开ClassTwo窗口?

修改

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

编辑2

我发现它不是摆动问题,而是来自MultickreChat类的Samck API的问题。所以任何研究过它的人都会帮助我。

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

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

4 个答案:

答案 0 :(得分:4)

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

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

同时更改classTwo的默认关闭操作以在关闭时隐藏,而不是退出:

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

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

答案 1 :(得分:3)

ClassOne中,您可以简单地记住是否使用ClassTwo打开了新的boolean

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

您还应该挂钩第二类的dispose事件来重置classTwoShown标志。

答案 2 :(得分:2)

尝试使用单例模式

答案 3 :(得分: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);
}

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

为多个窗口和按钮编辑。