2011-02-02 15 views
7

Mam 2 klasy swing, które rozszerzają JFrame. Oba mają metodę show() w tym konstruktorze. Od ClassOne zadzwoniłem pod numer ClassTwo, np. new ClassTwo() po zdarzeniu kliknięcia przycisku. Ale jeśli ponownie naciśniesz przycisk, otworzy się nowe okno dla ClassTwo. Jak więc mogę przerwać otwieranie okna ClassTwo, jeśli otworzy się jedno okno ClassTwo?jak zatrzymać otwieranie duplikatu okna za pomocą Smack API w swing?

Edit

teraz ten problem został rozwiązany, ale teraz, kiedy okno pierwszy otwarty ClassTwo pokazuje jedno okno. Następnie po zamknięciu, gdy ponownie otwieram okno ClassTwo, otwiera się dwa okna i ta liczba wciąż się powiększa. Dlaczego tak się dzieje?

EDIT 2

Okazało się, że jej nie huśtawka problem, ale jego problemy z MultiUsreChat klasy Samck API. Tak więc każdy, kto nad tym pracował, pomaga mi.

kod w ClassOne jest:

if(!winList.contains(room_jid)){ 
    new ClassTwo(room_jid,....); 
    winList.add(room_jid); 
} 

i ClassTwo jest:

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(); 

} 

Edycja 3

konstruktor 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); 
     } 
    } 
    }); 
} 

Odpowiedz

0

Powodem nie działa jest to, że tworzysz nową instancję ClassTwo wewnątrz obsługi przycisku, co oznacza utworzyć nowe okno przy każdym naciśnięciu przycisku. To powinno działać:

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); 
} 

Można użyć dowolnej kombinacji innych odpowiedzi wewnątrz obsługi przycisku, takich jak funkcjonalność przełączania lub innych skomplikowanych pomysłów, takich jak Singleton.Ale najważniejsze jest to, że powinieneś zanotować utworzenie nowego okna w module obsługi przycisku, ale stwórz go gdzieś, gdzie zostanie wywołany tylko raz.

Edytowany dla wielu okien i przycisków.

+0

@Kdansky: To rozwiązanie nie jest dla mnie użyteczne, ponieważ chcę jednocześnie otwierać wiele okien ClassTwo. Tak więc muszę utworzyć nową instancję za każdym razem, gdy kliknę przycisk. –

+0

Napisałeś "Więc jak mogę przerwać otwieranie okna ClassTwo, jeśli otworzy się jedno okno ClassTwo?". Proszę o wyjaśnienie. –

+0

@Kdansky: To było moje pytanie, które zostało rozwiązane, ale następnym pytaniem jest otwarcie wcześniej zamkniętych okien. zobacz moje "Edytuj". –

4

Nie ustawiaj ramki jako widocznej w konstruktorze ClassTwo. Zamiast zachować odniesienie do classTwo w classOne, a po kliknięciu przycisku, aby był on widoczny, tak jak poniżej:

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

także zmienić domyślną ścisłą operację classTwo do ukrycia na zamknięciu, zamiast wyjścia:

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 

Nie ma znaczenia, ile razy przycisk zostanie kliknięty, ponieważ wszystko, co robi, powoduje, że istniejące wystąpienie jest widoczne. Nie tworzy nowych instancji.

+0

ten problem został rozwiązany, ale teraz, kiedy po raz pierwszy otwieram okno ClassTwo, wyświetla się jedno okno. Następnie po zamknięciu, gdy ponownie otwieram okno ClassTwo, otwiera się dwa okna i ta liczba wciąż się powiększa. Dlaczego tak się dzieje? –

+0

Powinieneś pokazać kod, który tworzy okna classTwo. – dogbane

+0

napisałem mój kod, spójrz. –

3

W ClassOne można po prostu zapamiętać, czy otworzyłeś nowy ClassTwo przy użyciu boolean.

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

Należy również zaczep do rozporządzania przypadku klasy dwa, aby wyzerować flagę classTwoShown.

2

spróbuj użyć Singleton

+1

wytłumaczysz więcej, bo nie wiem o wzorze jednej tony. –

+0

http://www.javabeginner.com/learn-java/java-singleton-design-pattern – yahh