Pensavo più ad una gestione di questo tipo:
codice:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class FinestraPrincipale extends JFrame implements ActionListener {
private JButton cmdApri;
private JFrame secondoFrame;
public FinestraPrincipale() {
Container c = getContentPane();
c.setLayout( null );
cmdApri = new JButton("Apri finestra");
cmdApri.setBounds(20, 20, 100, 35);
cmdApri.addActionListener( this );
c.add( cmdApri );
setTitle( "Apertura singola finestra" );
setSize(800, 600);
setDefaultCloseOperation( EXIT_ON_CLOSE );
setLocationRelativeTo( null );
setVisible( true );
}
public void actionPerformed(ActionEvent ae) {
if (secondoFrame == null) {
secondoFrame = new JFrame();
secondoFrame.setSize(300, 300);
secondoFrame.setTitle( "Frame secondario" );
secondoFrame.setDefaultCloseOperation( DISPOSE_ON_CLOSE );
secondoFrame.setLocationRelativeTo( this );
}
secondoFrame.setExtendedState( Frame.NORMAL );
secondoFrame.setVisible( true );
secondoFrame.toFront();
}
public static void main(String[] args) {
FinestraPrincipale fp = new FinestraPrincipale();
}
}
Se la finestra non è stata creata, la creo, altrimenti la rivisualizzo (non mi preoccupo nemmeno se è visibile o meno) la riporto allo stato normale (non mi preoccupo se è ridotta ad icona o meno) e la porto in primo piano. 
Ciao.