Alterar JPanels dentro de um JFrame

Olá pessoal,

Primeiramente, gostaria de dizer que já pesquisei várias coisas aqui no fórum e em outros lugares da internet. Aparentemente meu problema já foi resolvido em outros tópicos mas as soluções apresentadas nunca davam certo :frowning:

A minha situação é o seguinte… Eu tenho um JFrame e dentro dele tenho:

  • um JMenu com alguns items nele
  • um JPanel

Bem… O meu problema é o seguinte: Dependendo do item que o usuário clicar no Menu, devo carregar um JPanel (q eu já tenha criado) naquele JPanel que está dentro do JFrame…

Agradeço a todos que puderem me ajudar!

Obrigado,
DanielSR

E quais soluções tu tentou?

Pode ser desde layouts como o http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html
Ou até mesmo componentes como http://java.sun.com/docs/books/tutorial/uiswing/components/tabbedpane.html

[quote=fabiofalci]E quais soluções tu tentou?

Pode ser desde layouts como o http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html
Ou até mesmo componentes como http://java.sun.com/docs/books/tutorial/uiswing/components/tabbedpane.html[/quote]

Na verdade eu já tinha visto esse CardLayout mas eu estava querendo fazer de uma outra forma…

Eu queria algo do tipo: O JPanel q eu adicionei ao meu JFrame passe a apontar para algum outro JPanel q eu tenha criado… Isso não é possível? Eu lembro ter feito isso há muito tempo atrás mas definitivamente não me recordo como eu fiz :frowning:

Isso é justamente o que o CardLayout faz, mas ao invés de um ele aponta pra vários. Sendo que
ele mostra um de cada vez, o que tu indicar!

Pesquise sobre o CardLayout e como utiliza-lo, acredito que seja a melhor forma p/ vc trabalhar com este recurso visual.

Sugiro também que você tenha Classes que herdam da classe JPanel p/ que a manutenção no seu fonte seja melhor, invez de estanciar vários JPanel´s dentro do seu JForm.

Abracos.

[quote=guivirtuoso]Pesquise sobre o CardLayout e como utiliza-lo, acredito que seja a melhor forma p/ vc trabalhar com este recurso visual.

Sugiro também que você tenha Classes que herdam da classe JPanel p/ que a manutenção no seu fonte seja melhor, invez de estanciar vários JPanel´s dentro do seu JForm.

Abracos.[/quote]

Eu tenho essas classes extendendo JPanel e lá no meu JFrame eu tenho um JPanel adicionado e que eu queria ir alterando conforme o usuário clicasse em determinados botoes… Eu não queria dizer como eu penso q eu devo fazer pq estou com medo de estar totalmente errado, mas aqui vai como eu acho q eu poderia fazer:

jPanel.add(new ClasseQExtendeJPanel());

Eu acredito q precise fazer mais coisa… mas essas coisas q eu nao sei o q fazer… E tb não sei se isso é certo…

Quem pode dizer que está errado né? :lol:

Mas assim, tenho um exemplinho bem simples do cardlayout, é por ai

public class CardLayoutTest extends JPanel {

	CardLayout cardLayout = null;
	JPanel mainPanel = null;
	JPanel panel1 = null;
	JPanel panel2 = null;
	JPanel panel3 = null;

	public CardLayoutTest() {
		this.initialize();
	}

	protected void initialize() {
		this.setLayout(new BorderLayout());
		this.add(getPanel(), BorderLayout.CENTER);
		this.add(getButtonPanel(), BorderLayout.SOUTH);
	}

	public JPanel getButtonPanel() {
		JPanel buttonPanel = new JPanel();

		JButton b = new JButton("1");
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cardLayout.show(mainPanel, "panel1");
			}
		});
		buttonPanel.add(b);

		b = new JButton("2");
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cardLayout.show(mainPanel, "panel2");
			}
		});
		buttonPanel.add(b);

		b = new JButton("3");
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cardLayout.show(mainPanel, "panel3");
			}
		});
		buttonPanel.add(b);

		return buttonPanel;
	}

	public JPanel getPanel1() {
		if (panel1 == null) {
			panel1 = new JPanel();
			panel1.setBackground(Color.WHITE);
			panel1.add(new JLabel("Panel1"));
		}
		return panel1;
	}

	public JPanel getPanel2() {
		if (panel2 == null) {
			panel2 = new JPanel();
			panel2.setBackground(Color.LIGHT_GRAY);
			panel2.add(new JLabel("Panel2"));
		}
		return panel2;
	}

	public JPanel getPanel3() {
		if (panel3 == null) {
			panel3 = new JPanel();
			panel3.setBackground(Color.CYAN);
			panel3.add(new JLabel("Panel3"));
		}
		return panel3;
	}

	public CardLayout getCardLayout() {
		if (cardLayout == null) {
			cardLayout = new CardLayout();
		}
		return cardLayout;
	}

	public JPanel getPanel() {
		if (mainPanel == null) {
			mainPanel = new JPanel(getCardLayout());
			mainPanel.add(getPanel1(), "panel1");
			mainPanel.add(getPanel2(), "panel2");
			mainPanel.add(getPanel3(), "panel3");
			getCardLayout().show(mainPanel, "panel1");
		}
		return mainPanel;
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setContentPane(new CardLayoutTest());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(500, 400);
		frame.setVisible(true);
	}
}

É um painel que muda pra outros 3 de acordo com os botões.

Olá,

Tentei seguir a sugestão do CardLayout ficou assim:

OBS:

  • estou fazendo no NetBeans e copiei apenas as partes referentes a essa parte do CardLayout…
  • as classes Cadastro() e Consulta() extendem JPanel
public class Main extends javax.swing.JFrame {
    private CardLayout cardLayout = null;
    private JPanel painelCadastro = null;
    private JPanel painelConsulta = null;
    private JPanel jPanelPrincipal;

    public Main() {
        initComponents();
    }

    private void initComponents() {
        jPanelPrincipal = new JPanel(getCardLayout());
        jPanelPrincipal.add(getPainelCadastro(), "cadastro");
        jPanelPrincipal.add(getPainelConsulta(), "consulta");
    }

    public CardLayout getCardLayout() {
        if (cardLayout == null) {
            cardLayout = new CardLayout();
        }
        return cardLayout;
    }

    public JPanel getPainelCadastro() {
        if (painelCadastro == null) {
            painelCadastro = new Cadastro();
        }
        return painelCadastro;
    }
    
    public JPanel getPainelConsulta() {
        if (painelConsulta == null) {
            painelConsulta = new Consulta();
        }
        return painelConsulta;
    }

    //eventos dos items do menu
    private void jMenuItemConsultarActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        getCardLayout().show(jPanelPrincipal, "cadastro");
    }                                                  
    
    private void jMenuItemCadastrarActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        getCardLayout().show(jPanelPrincipal, "consulta");
    }   
}

Porém, ao executar o código é lançada a seguinte excessão:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: wrong parent for CardLayout

Não sei o que eu posso ter feito errado e gostaria de saber se alguém tem alguma sugestão para o erro…

Agradeço desde já,
DanielSR

A principio está ok cara.

Mas tem mais código? Talvez alguma linha esteja estragando…
Tu nao esta inicializando de novo o jPanelPrincipal? Como tu está adicionando o jPanelPrincipal no teu JFrame?