7

我有 2 个摇摆班,它们扩展了JFrame. 两者都有show()构造函数中的方法。从我ClassOne打电话给按钮点击事件。但是,如果我再次按下按钮,则会打开新窗口。那么,如果打开了一个 ClassTwo 窗口,我该如何停止打开 ClassTwo 窗口呢?ClassTwonew ClassTwo()ClassTwo

编辑

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

编辑 2

我发现它不是摆动问题,而是来自 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);
       }
     }
  });
}
4

4 回答 4

4

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

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

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

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

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

于 2011-02-02T12:55:58.933 回答
3

您可以简单地ClassOne记住您是否ClassTwo使用.boolean

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

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

于 2011-02-02T12:57:38.457 回答
2

尝试使用单例模式

于 2011-02-10T13:09:58.343 回答
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);
}

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

针对多个窗口和按钮进行了编辑。

于 2011-02-14T14:32:15.920 回答