我有 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/