2011-02-02 11 views
7

Tengo 2 clases de oscilación que se extiende JFrame. Ambos tienen el método show() en el constructor. De ClassOne llamé ClassTwo como new ClassTwo() en el botón haga clic en evento. Pero si presiono el botón de nuevo, se abre una nueva ventana para ClassTwo. Entonces, ¿cómo puedo dejar de abrir la ventana de ClassTwo si se abre una ventana de ClassTwo?cómo detener la apertura de la ventana duplicada utilizando Smack API en swing?

Editar

ahora este problema se resuelve, pero ahora cuando ventana abierta ClassTwo primero que muestra una ventana. Luego, después de cerrarlo cuando abro de nuevo la ventana de ClassTwo, se abren dos ventanas y este conteo sigue aumentando. ¿Por qué está pasando esto?

EDITAR 2

me encontré con que no es problema, pero el swing de su problema de la clase MultiUsreChat de API Samck. Entonces, cualquiera que haya trabajado en eso me ayuda.

el código en ClassOne es:

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

y en ClassTwo es:

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

} 

Editar 3

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

Respuesta

0

La razón por la que no funciona es que se está creando una nueva instancia de ClassTwo dentro del controlador de botón, lo que significa que crear una nueva ventana cada vez que se pulsa el botón. Esto debería funcionar:

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

Se puede usar cualquier combinación de las otras respuestas en el interior del controlador de botón, tales como la funcionalidad de palanca u otras ideas complejas, como un conjunto unitario.Pero lo principal es que debe tener en cuenta crear una nueva ventana en el manejador de botones, pero créelo en algún lugar donde solo se llame exactamente una vez.

Editado para múltiples ventanas y botones.

+0

@Kdansky: Esta solución no es útil para mí porque quiero abrir múltiples ventanas de ClassTwo al mismo tiempo. Así que tengo que crear una nueva instancia cada vez que hago clic en el botón. –

+0

Usted escribió "Entonces, ¿cómo puedo detener la apertura de la ventana de ClassTwo si se abre una ventana de ClassTwo?". Por favor aclara –

+0

@Kdansky: Fue mi pregunta la que se resolvió, pero la siguiente pregunta es si está abriendo ventanas previamente cerradas. ver mi 'Editar'. –

4

No haga que el marco sea visible en el constructor ClassTwo. En su lugar, mantener una referencia a classTwo en ClassOne, y cuando se hace clic en el botón, hacerlo visible, así:

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

también cambiar operación de cierre por defecto de classTwo para ocultar el cierre, en lugar de la salida:

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 

Así que no importa cuántas veces se haga clic en el botón, porque todo lo que hace es hacer visible la instancia existente. No crea nuevas instancias.

+0

este problema está resuelto pero ahora, cuando abro por primera vez la ventana de ClassTwo, aparece una ventana. Luego, después de cerrarlo cuando abro de nuevo la ventana de ClassTwo, se abren dos ventanas y este conteo sigue aumentando. ¿Por qué está pasando esto? –

+0

Debería mostrar el código que crea la clase Dos ventanas. – dogbane

+0

he publicado mi código eche un vistazo. –

3

En ClassOne puede simplemente recordar si abrió una nueva ClassTwo usando un boolean.

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

También debe enganchar en el caso de disponer de clase dos a restablecer el indicador classTwoShown.

2

intente utilizar el patrón singleton

+1

me explicará más porque no sé sobre el patrón de una sola tonelada. –

+0

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

Cuestiones relacionadas