Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/04/2013, 00:28
Avatar de farfamorA
farfamorA
 
Fecha de Ingreso: noviembre-2010
Ubicación: Lima
Mensajes: 136
Antigüedad: 14 años, 2 meses
Puntos: 24
Respuesta: No funciona .setEnabled

No funciona porque los cambios los estás haciendo a un nuevo objeto de la clase Principal, y no al objeto de la clase Principal que ya tienes creado y que es visible.
Al momento de hacer new Principal() en la clase Datos estás creando un nuevo objeto de la clase Principal, no es el que estás viendo como ventana de tu aplicación.
Una solución para tu situación sería implementar el patrón Singleton, te explico: el patrón Singletón nos sirve para crear una y sólo una instancia de una clase para toda nuestra aplicación.
Es bastante simple: primero declaras el constructor de la clase en cuestión (la clase Principal en tu caso) como privado, con esto conseguirás que no puedas crear nuevos objetos de esa clase desde otras clases (o sea, no podrás hacer el new Principal() desde la clase Datos).
Código Java:
Ver original
  1. public class Principal extends javax.swing.JFrame {
  2.  
  3.     //Constructor privado para que no puedan llamarle desde fuera
  4.     private Principal() {
  5.         super();
  6.         //Código de la aplicación
  7.     }
  8.  
  9. }
Ahora hacemos un mecanismo para que cada vez que se necesite una instancia de esa clase, se devuelva siempre el mismo objeto y no uno nuevo.
Crearemos el que será nuestro único objeto como privado (no se podrá acceder a él directamente desde fuera de la clase) y estático.
Código Java:
Ver original
  1. public class Principal extends javax.swing.JFrame {
  2.  
  3.     //Instancia única de la clase
  4.     private static Principal instancia;
  5.  
  6.     //Constructor privado para que no puedan llamarle desde fuera
  7.     private Principal() {
  8.         super();
  9.         //Código de la aplicación
  10.     }
  11.  
  12. }
Y finalmente el método que le da vida al patrón Singleton: hacemos un obtenerInstancia que, en caso sea la primera vez que lo llamemos, instanciará nuestro objeto y nos lo entregará; y en caso no sea la primera vez que lo llamemos, se limitará a darnos el objeto que ya tenemos creado. Este método será público (podremos llamarlo desde fuera) y estático (podemos usar este método sin haber creado una instancia de la clase).
Código Java:
Ver original
  1. public class Principal extends javax.swing.JFrame {
  2.  
  3.     //Instancia única de la clase
  4.     private static Principal instancia;
  5.  
  6.     //Constructor privado para que no puedan llamarle desde fuera
  7.     private Principal() {
  8.         super();
  9.         //Código de la aplicación
  10.     }
  11.  
  12.     public static Principal obtenerInstancia() {
  13.         //Sólo si es la primera vez, instanciamos el objeto    
  14.         if ( instancia == null ) {
  15.             instancia = new Principal();
  16.         }
  17.         //Devolvemos siempre la única instancia que tenemos
  18.         return instancia;
  19.     }
  20.  
  21. }
Y listo, ahora cada vez que necesites una instancia de la clase Principal (obviamente también para abrir la ventana por primera vez para tu aplicación) usarás
Código Java:
Ver original
  1. Principal principal = Principal.obtenerInstancia();
Por ejemplo, y para terminar, desde la clase Datos harías lo siguiente:
Código Java:
Ver original
  1. Principal p = Principal.obtenerInstancia();
  2. p.jMenuItem1.setEnabled(true);
  3. this.dispose();
Si te ha quedado alguna duda, no dudes en dejarla por aquí.
Saludos.