Java - Problemas con Patron de diseño Singleton en app. MDI

 
Vista:

Problemas con Patron de diseño Singleton en app. MDI

Publicado por McCubo (2 intervenciones) el 30/05/2011 19:38:37
Hola y y desde ya muchas gracias por darte tiempo de leer este tema.
El problema es el siguente:
Tengo una app. MDI con algunos JinternalFrames los cuales son llamados desde una JMenuBar, mi intencion es que cada internalFrame solo pueda poseer una instancia de clase a la vez. por lo cual he leido un poco acerca del patron de diseño Singleton el cual me ha funcionado bastante bien, porque cuando una instancia de JinternalFrame esta hecha no me deja tener una nueva instancia de la misma.
El problema radica que cuando tengo un JInternalframe instanciado e intento instanciarlo denuevo el JinternalFrame se congela y se desbloquea hasta que vuelvo a querer llamarlo (desde la Opcion del JMenu).
pongo una porcion de codigo para ser mas explicativo:



public class OptionFrame extends JInternalFrame
public static OptionFrame optionInstance = new OptionFrame();

public static OptionFrame getInstance(){
return optionInstance;
}

/** Creates new form OptionFrame */
private OptionFrame() {
initComponents();
todasMisAcciones();
}


y esa clase la intento llamar desde un ActionListener de un JMenuItem, asi:


subMenuOption.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
OptionFrame optionFrame = OptionFrame.getInstance();
optionFrame.setVisible(true);
optionFrame.setSelected(true);
jdesktopPane.add(optionFrame);
} catch (PropertyVetoException ex) {
logger.debug(ex);
}
}
});

La primera vez que se ejecuta el Listener del JMenuItem, todo bien, pero la segunda vez, el InternalFrame se me congela y tengo que ejecutar denuevo el Listener que manda a llamar al InternalFrame.
y me tira la Siguente exception:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: illegal component position


Seguire leyendo un poco a ver si encuentro solucion, pero igual Muchas gracias de antemano a alguna sugerencia del porque el posible error
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problemas con Patron de diseño Singleton en app. MDI

Publicado por Tom (1831 intervenciones) el 31/05/2011 13:11:36
Yo creo que tu problema está aquí:

jdesktopPane.add(optionFrame);

Sin ver más, yo diría que la primera vez sí, debes hacer .add() pero en llamadas siguientes no. Una vez que el jinternalframe está añadido al jdesktoppane deberías usar, creo:

jDesktopPane.setSelectedFrame(JInternalFrame f)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas con Patron de diseño Singleton en app. MDI

Publicado por McCubo (2 intervenciones) el 31/05/2011 20:06:03
Efectivamente Tom, ese era el detalle que faltaba evaluar, gracias por tu respuesta pronta y precisa.
Muchas Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas con Patron de diseño Singleton en app. MDI

Publicado por kevLinK (1 intervención) el 14/10/2011 23:31:24
Gracias, esta fue la única solución que me funcionó después de una ardua búsqueda xD, cabe mencionar que para que funcione propiamente no hay que usar instancia.dispose(); a la hora de cerrar, no sólo se podrá abrir una vez, hay que usar
miInternalFrame.setDefaultCloseOperation(HIDE_ON_CLOSE);

Y a la hora de cerrar la ventana, en vez de instancia.dispose(); se debe usar
miInternalFrame.doDefaultCloseAction();

Y ya con eso me funcionaron los internal frames con singleton :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Solución. Problemas con Patron de diseño Singleton en app. MDI

Publicado por Alonso Pérez C. (1 intervención) el 25/11/2012 07:44:13
Solamente hay que comprobar si el contenedor, en este caso un JDesktopPane, ya contiene al elemento contenido, el JInternalFrame. Si no es así, se debe agregar el elemento contenido al contenedor. Por el contrario, si el elemento contenido ya se encuentra en el contenedor, se debe seleccionar. Ej.

if (!jdesktopPane.isAncestorOf(optionFrame)) {
//Si el JDesktopPane no contiene a optionFrame, este se agrega.
jdesktopPane.add(optionFrame);
}else{
//Si el JDesktopPane ya contiene a optionFrame, este solo se selecciona.
jdesktopPane.setSelectedFrame(optionFrame);
}

Con esta pequeña condición se soluciona el problema de posicionamiento de componentes que tienes. Espero sea de ayuda para alguien mas. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar