Java 如何在swing中使用Smack API停止打开重复窗口?
我有两个swing类,它们扩展了Java 如何在swing中使用Smack API停止打开重复窗口?,java,swing,window,smack,Java,Swing,Window,Smack,我有两个swing类,它们扩展了JFrame。这两个构造函数中都有show()方法。从ClassOne我调用了ClassTwo类似于newclasstwo()的按钮点击事件。但是如果我再次按下按钮,ClassTwo的新窗口将打开。那个么,若有一个ClassTwo窗口被打开,我怎么能停止打开ClassTwo窗口呢 编辑 现在这个问题解决了,但现在当我第一次打开ClassTwo窗口时,它显示了一个窗口。然后在关闭它之后,当我再次打开Class2窗口时,它打开了两个窗口,并且这个计数继续增加。为什么会
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,如果只有一个按钮螺母,您的解决方案将解决问题。在我的例子中,按钮的数量是动态的。所以,如果我这样做,那么我还必须维护隐藏的已打开窗口的列表或地图。你知道我该怎么做吗?