Navegar entre JFrames

Alô galera do GUJ, Gostaria de compartilhar esse código que criei mostrando como navegar entre telas utilizando somente o JFrame do pacote Swing. Antes de consegui fui a diversos fóruns onde não consegui informação o suficiente para construir a passagem de telas só utilizando os JFrames, muitos me aconselharam a esquecer e utilizar o JDesktopPane ou o JInternalFrame que não deixavam a aparência como eu queria, segue aí o código com a minha programação com 4 classes, sendo 3 Janelas e 1 classe de controle com o MouseListener também podendo ser trocado pelo ActionListener.

Janela 1 Branca

    import java.awt.Color;
    import java.util.Observable;
    import java.util.Observer;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    public class Janela1 extends JFrame implements Observer {
    	private JPanel pnl;
    	private JLabel btnAzul1, btnPreto1;
    	private Controle controle;	
    	public Janela1() {
    		controle = new Controle(this, null, null);
    		controle.addObserver(this);			
    		setBounds(0, 0, 800,600);
    		setVisible(true);
    		setResizable(false);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setLayout(null);
    		pnl = new JPanel();
    		pnl.setBounds(0, 0, 800, 600);
    		pnl.setVisible(true);
    		pnl.setBackground(Color.WHITE);
    		btnAzul1 = new JLabel("Azul");
    		btnPreto1 = new JLabel("Preto");
    		btnAzul1.addMouseListener(controle);
    		btnPreto1.addMouseListener(controle);
    		pnl.add(btnAzul1);
    		pnl.add(btnPreto1);
    		add(pnl);
    	}	
    	public JPanel getPnl() {return pnl;}
    	public JLabel getBtnAzul1() {return btnAzul1;}
    	public JLabel getBtnPreto1() {return btnPreto1;}
    	public Controle getControle() {	return controle;}
    	@Override
    	public void update(Observable o, Object arg) {}
    }

Janela 2 Preta

import java.awt.Color;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Janela2 extends JFrame  implements Observer{
	private JPanel pnl;
	private JLabel btnAzul2, btnBranco2;
	private Controle controle;	
	public Janela2() {
		controle = new Controle(null, this, null);
		controle.addObserver(this);
		setBounds(0, 0, 800,600);
		setVisible(true);
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLayout(null);
		pnl = new JPanel();
		pnl.setBounds(0, 0, 800, 600);
		pnl.setVisible(true);
		pnl.setBackground(Color.BLACK);
		btnAzul2 = new JLabel("Azul");
		btnBranco2 = new JLabel("Branco");
		btnAzul2.addMouseListener(controle);
		btnBranco2.addMouseListener(controle);
		pnl.add(btnAzul2);
		pnl.add(btnBranco2);
		add(pnl);
	}
	public JPanel getPnl() {return pnl;}
	public JLabel getBtnAzul2() {return btnAzul2;}
	public JLabel getBtnBranco2() {	return btnBranco2;}
	public Controle getControle() {return controle;}
	@Override
	public void update(Observable o, Object arg) {}
}

Janela 3 Azul

import java.awt.Color;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Janela3  extends JFrame  implements Observer{
	private JPanel pnl;
	private JLabel btnPreto3, btnBranco3;
	private Controle controle;	
	public Janela3() {
		controle = new Controle(null, null, this);
		controle.addObserver(this);	
		setBounds(0, 0, 800,600);
		setVisible(true);
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLayout(null);
		pnl = new JPanel();
		pnl.setBounds(0, 0, 800, 600);
		pnl.setVisible(true);
		pnl.setBackground(Color.BLUE);
		btnPreto3 = new JLabel("Preto");
		btnBranco3 = new JLabel("Branco");
		btnPreto3.addMouseListener(controle);
		btnBranco3.addMouseListener(controle);
		pnl.add(btnPreto3);
		pnl.add(btnBranco3);
		add(pnl);
	}
	public JPanel getPnl() {return pnl;}
	public JLabel getBtnPreto3() {return btnPreto3;}
	public JLabel getBtnBranco3() {return btnBranco3;}
	public Controle getControle() {return controle;}
	@Override
	public void update(Observable o, Object arg) {}
}

Controle

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Observable;
public class Controle extends Observable implements MouseListener {
	private static Janela1 jan1;
	private static Janela2 jan2; 
	private static Janela3 jan3;	
	public Controle(Janela1 jan1, Janela2 jan2, Janela3 jan3) {
		this.jan1 = jan1;
		this.jan2 = jan2;
		this.jan3 = jan3;
	}
	public static void main(String[] args) {
		jan1 = new Janela1();
	}
	@Override
	public void mouseClicked(MouseEvent e) {

		if(jan1!=null){
			if(e.getSource().equals(jan1.getBtnAzul1())){
				System.out.println("1.1");
				if(jan3==null){
					jan1.dispose();
					jan3 = new Janela3();
				}else{
					jan1.dispose();
					jan3.setVisible(true);
				}
			}
		}
		if(jan1!=null){
			if(e.getSource().equals(jan1.getBtnPreto1())){
				if(jan2==null){
					jan1.dispose();
					jan2 = new Janela2();
				}else{
					jan1.dispose();
					jan2.setVisible(true);
				}
			}
		}
		if(jan2!=null){
			if(e.getSource().equals(jan2.getBtnAzul2())){
				if(jan3==null){
					jan2.dispose();
					jan3 = new Janela3();
				}else{
					jan2.dispose();
					jan3.setVisible(true);
				}
			}
		}
		if(jan2!=null){

			if(e.getSource().equals(jan2.getBtnBranco2())){
				System.out.println("2.2");
				if(jan1==null){
					jan2.dispose();
					jan1 = new Janela1();
				}else{
					jan2.dispose();
					jan1.setVisible(true);
				}
			}
		}
		if(jan3!=null){
			if(e.getSource().equals(jan3.getBtnPreto3())){
				System.out.println("3.1");
				if(jan2==null){
					jan3.dispose();
					jan2 = new Janela2();
				}else{
					jan3.dispose();
					jan2.setVisible(true);
				}
			}
		}

		if(jan3!=null){
			if(e.getSource().equals(jan3.getBtnBranco3())){
				System.out.println("3.2");
				if(jan1==null){
					jan3.dispose();
					jan1 = new Janela1();
				}else{
					jan3.dispose();
					jan1.setVisible(true);
				}
			}		
		}
	}

	@Override
	public void mouseEntered(MouseEvent e) {}

	@Override
	public void mouseExited(MouseEvent e) {}

	@Override
	public void mousePressed(MouseEvent e) {}

	@Override
	public void mouseReleased(MouseEvent e) {}
}

Caso alguém tenha alguma sugestão para melhorias no código pfv desde já agradeço a colaboração.

Faria diferente:

interface Form {
    void exibir();
    void fechar();
}

interface Form1 extends Form {
    // getters e setters do Form1
}

abstract class AbstractForm extends JFrame implements Form {
    public void exibir() { setVisible(true); }
    public void fechar() { dispose(false); }
    public Controle getControle();
    public void setControle(Controle controle);
}

class Janela1 extends AbstractForm implements Form1 {
}

class Janela2 extends AbstractForm implements Form2 {
}

class Janela3 extends AbstractForm implements Form3 {
}

class Controle {
    Form1 form1 = new Janela1();
    Form2 form2 = new Janela2();
    Form3 form3 = new Janela3();
    void exibirJanela1();
    void exibirJanela2();
    void exibirJanela3();
}

// no main

public static void main() {
    Controle controle = new Controle();
    controle.exibirJanela1();
}

// no mouse

btnAzul1.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        getControle().exibirJanela3();
    }
});

A vantagem é que usaria somente a interface Form, escondendo tudo que é referente aos componentes UI (JFrame, JButton, …). O Form1 seria uma interface de setters e getters, nesse seu exemplo é desnecessário, mas usaria assim:

interface FormCadastro extends Form {
    void setNome(String nome);
    String getNome();
}

class JanelaCadastro extends JFrame implements FormCadastro {
    void setNome(String nome) {
        nomeTextField.setText(nome);
    } 
    String getNome() {
       return nomeTextField.getText();
    }
}

Ao usar a interface, vc consegue sumir com os componentes UI

FormCadastro form = new JanelaCadastro();
form.setNome("Fulano");
form.exibir();

Código completo das janelas coloridas. Por ser muito, estou postando em zip

teste.zip (3,7 KB)

Observe que na classe Controle (no link acima) não há nada relativo a componentes UI.

muito obrigado amigo, sou novo em Java isso me ajudará bastante