Alternar JPanels a partir de um JMenuItem com Swing?

pessoal,

tenho um formulário com um menu e outros componentes em classes diferentes, preciso que a partir de um evento no menuitem, alterar o jPanel do formulario.

ALguém tem algum exemplo ?

Os componentes do formulário são:

JMenu com seus JMenuItem

um JDesktop, e diversos JPanel associados com o JDesktop, que deverão ser mostrados ou não a depender do clique no menu …

valeu

Você poderia tentar usar um JPanel que usa java.awt.CardLayout e associar os JPanels a esse JPanel
A CardLayout object is a layout manager for a container. It treats each component in the container as a card. Only one card is visible at a time, and the container acts as a stack of cards. The first component added to a CardLayout object is the visible component when the container is first displayed.
(se bem que sou mais a favor de usar um JTabbedPane).

O que você vai ter é apenas um JInternalFrame que vai alternar os JPanels?

Aí está:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Principal extends JFrame{
	
	
	private JDesktopPane desktopPane;
	private JMenuItem menuItem1, menuItem2;
	private JMenuBar menuBar;
	private JMenu menu;
	private Controlador controlador;
	
	public Principal(){
		
		super("Exemplo de JDesktopPane");
		
		desktopPane = new JDesktopPane();
		controlador = new Controlador(desktopPane);	
		
		
		int inset = 50;
		
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(inset, inset,
                  screenSize.width  - inset*2,
                  screenSize.height - inset*2);
		
		
		menuItem1 = new JMenuItem("Painel Amarelo");
		menuItem1.setActionCommand("menuItemAmarelo");
		menuItem1.addActionListener(controlador);
		
		menuItem2 = new JMenuItem("Painel Verde");
		menuItem2.setActionCommand("menuItemVerde");
		menuItem2.addActionListener(controlador);
		
		menuBar = new JMenuBar();
		menu = new JMenu("Opções");	
		
		menu.add(menuItem1);
		menu.add(menuItem2);
		
		setContentPane(desktopPane);
		
		menuBar.add(menu);		
		
		setJMenuBar(menuBar);
		
			
		setVisible(true);
		setResizable(true);	
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	
	public static void main(String args[]){
		
		Principal p = new Principal();
	}
	
}
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;


public class Controlador extends InternalFrameAdapter implements ActionListener{
	
	
	private JDesktopPane desktopPane;
	private JPanel umPanel;
	private JInternalFrame iFrame;
	private boolean estaAberto = true;
	private JPanelAmarelo panelAmarelo;
	private JPanelVerde panelVerde;
	private Container container;
	
	
	public Controlador(JDesktopPane desktopPane){
		
		this.desktopPane = desktopPane;
		
		panelAmarelo = new JPanelAmarelo();
		panelVerde = new JPanelVerde();
		
		iFrame = new JInternalFrame("InternalFrame Mutante", true, true, true, true);
		iFrame.setName("IFrame");
		iFrame.setLayout(new BorderLayout());
		container = iFrame.getContentPane();
		iFrame.addInternalFrameListener(this);
		desktopPane.add(iFrame);
	}
	
	
	public void actionPerformed(ActionEvent evt){
		
		String menuSelecionado = evt.getActionCommand();
		
		if(menuSelecionado.equals("menuItemAmarelo")){
			
			if(!estaAberto){
				desktopPane.add(iFrame);
			}
			container.removeAll();
			container.add(panelAmarelo, BorderLayout.CENTER);
			iFrame.revalidate();
			iFrame.pack();						
			iFrame.setVisible(true);
			estaAberto = true;
			
		}
		else if(menuSelecionado.equals("menuItemVerde")){
			
			if(!estaAberto){
				desktopPane.add(iFrame);
			}
			container.removeAll();
			container.add(panelVerde, BorderLayout.CENTER);
			iFrame.revalidate();
			iFrame.pack();						
			iFrame.setVisible(true);
			estaAberto = true;
		}
	}
	
	public void internalFrameClosing(InternalFrameEvent e){
        
        String nomeFrame = ((JInternalFrame)e.getSource()).getName(); 
        
        if(nomeFrame.equals("IFrame")){
            
            estaAberto = false;
        }
    }
}
import javax.swing.JPanel;
import java.awt.*;

public class JPanelVerde extends JPanel{
	
	public JPanelVerde(){
		
		super();
		setPreferredSize(new Dimension(300, 400));
		setBackground(Color.GREEN);
	}
}
import javax.swing.JPanel;
import java.awt.*;

public class JPanelAmarelo extends JPanel{
	
	public JPanelAmarelo(){
		
		super();
		setPreferredSize(new Dimension(300, 400));
		setBackground(Color.YELLOW);
	}
}

:thumbup:

Valeu cara, mas me diz uma coisa … como eu faço pra tirar a barra superior do JInternalFrame o, queria que ele ocupasse toda a área do JDesktop, sem aparecer a barra de maximizar e tal, isso é possível ?

valeu!

Então… até onde eu sei só é possível criar um JInternalFrame sem os botões de maximizar, fechar, etc… e sem título, usando um contrutor sem parâmetros.
Criando esse tipo de JInternalFrame, e deixando ele maximizado, a única coisa que o usuário poderia fazer seria movimentá-lo.
Mas se você sempre vai trabalhar desta maneira, com o JPanel maximizado, e sem a possibilidade de o usuário fechá-lo, poderia deixar de lado o JInternalFrame, e usar um JPanel no Container do JFrame mesmo, pegando toda a área disponível.

Qualquer coisa posta aí…

[]'s