Как остановить открытие дубликата окна с помощью Smack API в разгаре? - PullRequest
7 голосов
/ 02 февраля 2011

У меня есть 2 класса свинга, которые расширяются JFrame. Оба имеют метод show() в конструкторе. С ClassOne я звонил ClassTwo как new ClassTwo() при нажатии кнопки. Но если я снова нажму кнопку, откроется новое окно для ClassTwo. Итак, как я могу остановить открытие окна ClassTwo, если открыто одно окно ClassTwo?

Редактировать

Теперь эта проблема решена, но теперь, когда я впервые открываю окно ClassTwo, отображается одно окно. Затем после закрытия, когда я снова открываю окно ClassTwo, оно открывает два окна, и этот счет продолжает увеличиваться. Почему это происходит?

РЕДАКТИРОВАТЬ 2

Я обнаружил, что это не проблема свинга, а проблема из класса MultiUsreChat API Samck. Так что любой, кто работал над этим, поможет мне.

код в 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 голосов
/ 02 февраля 2011

Не делайте рамку видимой в конструкторе ClassTwo.Вместо этого сохраните ссылку на classTwo в classOne, а когда кнопка нажата, сделайте ее видимой, например, так:

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

Также измените стандартную операцию закрытия classTwo, чтобы скрыть ее при закрытии вместо выхода:

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

Так что не имеет значения, сколько раз нажата кнопка, потому что все, что она делает, это делает существующий экземпляр видимым.Он не создает новые экземпляры.

3 голосов
/ 02 февраля 2011

В ClassOne вы можете просто вспомнить, открыли ли вы новый ClassTwo, используя boolean.

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

. Вы также должны подключиться к событию dispose класса два для сброса classTwoShown флаг.

2 голосов
/ 10 февраля 2011

попробуйте использовать шаблон синглтона

0 голосов
/ 14 февраля 2011

Причина, по которой это не работает, заключается в том, что вы создаете новый экземпляр 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);
}

Вы можете использовать любую комбинацию других ответов внутри обработчика кнопки, например, функциональность переключения или другие сложные идеи, такие как синглтон. Но главное, что вы должны отметить, что создайте новое окно в обработчике кнопок, но создайте его где-нибудь, где он вызывается только один раз.

Отредактировано для нескольких окон и кнопок.

...