Generalmente non ha molto senso dividere un'applicazione in due: Login e Programma principale. Anche se la cosa può, ovviamente, essere fatta, normalmente la parte di Login viene incorporata nell'applicazione, che eseguirà prima la finestra della richiesta utente/password, poi proseguirà aprendo tutte le altre finestre.

Ora, dipende molto da come hai strutturato l'applicazione (di cui non sappiamo niente).

Per "aprire" una finestra è sufficiente istanziare un oggetto di una classe che estenda JFrame. Nel costruttore di tale classe, solitamente, viene indicato di visualizzare la finestra, posizionarla, dimensionarla, ecc...

Se tu hai già una applicazione stand-alone e ciò che vuoi fare è richiedere una login prima di lanciarla, è sufficiente invocare la JVM dopo la validazione dell'utente/password.

Vediamo le due situazioni, a grandi linee:

Situazione 1 (un'unica applicazione):
codice:
// Classe principale (contenente il main):
...
public static void main(String[] args) {
   ...   // eventuali inizializzazioni
   chiediLogin();   // Lo puoi implementare come ti pare
   if ( loginCorretta ) {
      avviaFinestraPrincipale();   // Lo puoi implementare come ti pare
   }
}
Situazione 2 (Applicazioni distinte: login e programma):
codice:
// Classe per la login (ovviamente con un main):
...
public static void main(String[] args) {
   ...   // eventuali inizializzazioni
   chiediLogin();   // Lo puoi implementare come ti pare
   if ( loginCorretta ) {
      // Avvio una seconda applicazione:
      Runtime r = Runtime.getRuntime();

      // stringa che useresti nella riga di comando per avviare l'applicazione
      String comando = "...";
      r.exec( comando );
   }
}
Il primo metodo consente di avere una sola JVM avviata, il secondo ne fa eventualmente partire una seconda. Da notare che potresti anche, semplicemente, il metodo statico main() della seconda applicazione, passandogli tutti i parametri (cosa che rende più performante il tutto).


Ciao.