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
//Constructor privado para que no puedan llamarle desde fuera
super();
//Código de la aplicación
}
}
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
//Instancia única de la clase
//Constructor privado para que no puedan llamarle desde fuera
super();
//Código de la aplicación
}
}
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
//Instancia única de la clase
//Constructor privado para que no puedan llamarle desde fuera
super();
//Código de la aplicación
}
//Sólo si es la primera vez, instanciamos el objeto
if ( instancia == null ) {
}
//Devolvemos siempre la única instancia que tenemos
return instancia;
}
}
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
Por ejemplo, y para terminar, desde la clase Datos harías lo siguiente:
Código Java:
Ver originalp.jMenuItem1.setEnabled(true);
this.dispose();
Si te ha quedado alguna duda, no dudes en dejarla por aquí.
Saludos.