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

标签 java swing window smack

我有 2 个扩展 JFrame 的 swing 类。两者在构造函数中都有 show() 方法。从 ClassOne 我调用了 ClassTwo 就像 new ClassTwo() 按钮点击事件。但是,如果我再次按下按钮,则会打开 ClassTwo 的新窗口。那么,如果打开了一个 ClassTwo 窗口,我该如何停止打开 ClassTwo 窗口呢?

编辑

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

编辑 2

我发现它不是 Swing 问题,而是来自 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

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

最佳答案

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

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

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

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

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

关于java - 如何在 swing 中使用 Smack API 停止打开重复窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4874667/

相关文章:

java - JSON 格式日志未翻译为西里尔文

java - JFrame 在两个不同面板上使用一个组件使其消失

javascript - 使用 javascript 将窗口位置更改为特定元素?

Swift - 如何在菜单栏应用程序中跨窗口共享类(作为单例)?

java - 需要了解有关 N × N 正方形的更多信息(n = 用户输入)

WPF MVVM 窗口导航

java - PaintComponent 总是更新矩形

java - 如何对列表文件中的整数进行排序?

java - JFrame:WAITING按下表单上的按钮以接收类中的值并继续

java - 如何在 ActionListener 进行时更新 swing UI