2011-02-02 11 views
7

Ho 2 classi di swing che si estende JFrame. Entrambi hanno il metodo show() nel costruttore. Da ClassOne ho chiamato ClassTwo come new ClassTwo() sull'evento clic del pulsante. Ma se premo nuovamente il pulsante, viene aperta una nuova finestra per ClassTwo. Quindi, come posso interrompere l'apertura della finestra di ClassTwo se viene aperta una finestra di ClassTwo?come interrompere l'apertura della finestra duplicata usando l'API Smack in swing?

Modifica

ora questo problema è risolto, ma ora quando finestra ClassTwo prima apertura mostra una finestra. Poi, dopo averlo chiuso quando apro di nuovo la finestra di ClassTwo, apre due finestre e questo conteggio continua ad aumentare. Perché questo sta accadendo?

EDIT 2

ho trovato che non la sua oscillare problema ma il suo problema dalla classe MultiUsreChat di Samck API. Quindi chiunque mi abbia lavorato mi può aiutare.

il codice ClassOne è:

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

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

} 

Edit 3

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

risposta

0

Il motivo per cui non funziona è che si sta creando una nuova istanza di ClassTwo all'interno del gestore di pulsante, il che significa che creare una nuova finestra ogni volta che si preme il pulsante. Questo dovrebbe funzionare:

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

È possibile utilizzare qualsiasi combinazione delle altre risposte all'interno del gestore di pulsante, come ad esempio la funzionalità di commutazione o di altre idee complesse, come ad esempio un Singleton.Ma la cosa principale è che dovresti notare creare una nuova finestra nel gestore di pulsanti, ma crearla da qualche parte dove viene chiamata esattamente una sola volta.

Modificato per più finestre e pulsanti.

+0

@Kdansky: questa soluzione non è utile per me perché desidero aprire contemporaneamente più finestre ClassTwo. Quindi devo creare una nuova istanza ogni volta che clicco sul pulsante. –

+0

Hai scritto "Allora, come posso interrompere l'apertura della finestra di ClassTwo se viene aperta una finestra di ClassTwo?". Si prega di precisare. –

+0

@Kdansky: è stata la mia domanda che è stata risolta, ma la prossima domanda è l'apertura di finestre chiuse in precedenza. vedi il mio 'Edit'. –

4

Non rendere visibile la cornice nel costruttore ClassTwo. Invece, mantenere un riferimento a classTwo in ClassOne, e quando il pulsante viene premuto, renderla visibile, in questo modo:

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

anche cambiare impostazione predefinita operazione di chiusura del classTwo da nascondere su una stretta, invece di uscita:

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 

Quindi non importa quante volte si fa clic sul pulsante, perché tutto ciò che fa è rendere visibile l'istanza esistente. Non crea nuove istanze.

+0

questo problema è risolto ma ora quando apro per la prima volta la finestra di ClassTwo, viene visualizzata una finestra. Poi, dopo averlo chiuso quando apro di nuovo la finestra di ClassTwo, apre due finestre e questo conteggio continua ad aumentare. Perché questo sta accadendo? –

+0

Dovresti mostrare il codice che crea le finestre classTwo. – dogbane

+0

ho pubblicato il mio codice dare un'occhiata. –

3

In ClassOne si potrebbe semplicemente ricordare se si è aperto un nuovo utilizzando un boolean.

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

Si dovrebbe anche collegare in caso Smaltire classe due per ripristinare la bandiera classTwoShown.

2

provare utilizzando il pattern Singleton

+1

spiegheresti più cause che non so sul pattern a una tonnellata. –

+0

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