Ver Mensaje Individual
  #5 (permalink)  
Antiguo 02/12/2011, 04:32
jaortega
 
Fecha de Ingreso: diciembre-2011
Mensajes: 3
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Inmovilizar Ventanas

Cita:
Iniciado por FiruzzZ Ver Mensaje
Jamás conocí un soft q no te permita desplazar las ventanas a mi antojo (creo q también es una característica como vos lo mensionas).

pregunta y sugerencia: ¿Con hacer Modal el JDialog no te alcanza?
Hola:

Soy nuevo en el foro. Sólo escribía porque buscando una solución a este tema no encontré nada "fácil", y después de darle algunas vueltas, dí con una solución que puede ser sencilla y que a mí me sirve. Supongo que habrá alguien en algún sitio que se le haya ocurrido antes, pero no lo he visto. Hay una referencia parecida en http://grupos.emagister.com/debate/fijar_un_jinternalframe/6709-289788.

En mi proyecto me creo una nueva clase que extienda a JInternalFrame, y que sobreescriba el método reshape (creo que también debería funcionar en JFrame, sólo que en este caso el método es heredado de JWindow). Este sería un ejemplo:

import javax.swing.JInternalFrame;

public class TestLockableInternalFrame extends JInternalFrame{
private boolean locked = false;

@Override
public void reshape(int x, int y, int width, int height) {
if (!locked) {
super.reshape(x, y, width, height);
}
}

public boolean isLocked() {
return locked;
}

public void setLocked(boolean locked) {
this.locked = locked;
}
}

Para inmovilizar el frame, lo único que hay que hacer es llamar a la función setLocked(true), y para volver a movilizarlo, llamar a setLocked(false).

OJO! Nunca llamar a setLocked(false) antes de dibujar el Frame, porque si no, no se visualizaría.

Yo por ejemplo en mi aplicación tengo una opción de menú para inmovilizar paneles, que lo que hace es coger todos los jinternalframes que están visibles y hacerles setLocked(false).

La aplicación la estoy haciendo con NetBeans, y esto del reshape lo miré cuando ya tenía todo dibujado, así que para no tener que hacer otra vez todo, lo que he hecho es "customizar" el código de los JInternalFrame y ponerles que se creen como objetos TestLockableInternalFrame.

Y este sería el ejemplo de evento de un botón que me inmoviliza un JInternalFrame:

private void addJButton1ActionPerformed(java.awt.event.ActionEv ent evt) {
TestLockableInternalFrame frame = (TestLockableInternalFrame) JInternalFrame1;
if (frame.isLocked()) {
frame.setLocked(false);
} else {
frame.setLocked(true);
}
}