我有两个扩展类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);
}
}
});
}
答案 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);
}
您可以在按钮处理程序中使用其他答案的任意组合,例如切换功能或其他复杂的想法,例如单例。但最重要的是你应该注意在按钮处理程序中创建一个新窗口,但是只在它被调用一次的地方创建它。
为多个窗口和按钮编辑。