Panel dentro de Panel

4 respostas
xpaulinhox

Galera é coisa muito simples mas não sei como procurar, pois já tentei várias formas mas não encontrei então vou postar aqui, que vocês vão tirar de letra.

Seguinte, estou fazendo um projetinho em java para a facul.

Neste projeto eu tenho uma janela com menus e dependendo do menu escolhido abre um novo layout mas dentro da mesma janela.

Exemplo:
Menu - funcionário => ao clicar abre um formulário referente a funcionário
Menu - cargo => ao clicar abre um formulário referente a cargo.

O que eu tenho hoje é mais ou menos assim.

Classe principal que monta a janela com os menus e o contentPane() dela só tem um label escrito “Bem Vindo”

public class PrincipalGui implements ActionListener{
                private JFrame win = new JFrame("Trabalho Final Java");
	        private Container panel = win.getContentPane();

public void run(){
          	this.createPrincipalGui();
                PrincipalGui.win.setVisible(true);
}

public void createPrincipalGui(){
		GridBagLayout gBagLayout = new GridBagLayout();
		Font font = new Font("serif", Font.BOLD, 40);
		JLabel labelPrincipal = new JLabel("Seja Bem Vindo");
		JMenuBar menuBar = new JMenuBar(); //Barra de menu
		JMenu menuFunc = new JMenu("Funcionário"); //Menu
		JMenuItem itemFunc = new JMenuItem("Funcionário"); //Item de menu

		
		/* Set configuration menu */
		
			/* Menu Funcionario */		
		menuFunc.add(itemFunc);
			/* Barra de Menu */
		menuBar.add(menuFunc);
			/* Item menu */
		itemFunc.setActionCommand("funcionario");
		itemFunc.addActionListener(this);		
		
		/* Set configuration label */
		labelPrincipal.setFont(font);
		
		/* Set configuration panel */
		panel.setLayout(gBagLayout); //Define layout do painel
		panel.add(labelPrincipal);	
		
		/* Set configuration window */
		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Quando fechar a janela fecha também a aplicação
		win.setSize(800,600); //Define a dimensão da janela
		win.setResizable(false); // Não permite altera tamnho da janela
		win.setLocationRelativeTo(null); // Centraliza Janela
		win.setJMenuBar(menuBar);

public void actionPerformed(ActionEvent e){
		/* actions process of itemMenu */
		if (e.getActionCommand().equals("funcionario")){
			Message.messageSimply("Você clicou em funcionário", "Funcionário");
			FuncionarioGui f = new FuncionarioGui();
			f.run();
		}		
	}

A dúvida é se nessa minha classe FuncionarioGui que eu chamo no actionPerformed eu tenho que criar uma nova window e fazer o mesmo processo que nesta principal ou se eu tenho que usar o mesmo contentPane() e algumas outras dúvidas mais.

Gostaria se possível um link para algum tutorial, artigo, dica alguma coisa bem simples explicando esta parte só para eu poder continuar o projeto.

OBS: Acho minha dúvida é bem básica e simples mas o post ficou um pouco grande pela minha dificuldade de expressar o que eu quero.

Muito obrigado e desculpa qualquer coisa.

4 Respostas

xpaulinhox

Nunca pensei que fosse tão difícil de saber como fazer isto em java.

Será que alguém não tem um projeto pronto para eu tomar de exemplo?

Ou será que não foi compreendido o que eu falei?

M

Se sua classe FuncionarioGUI estender JPanel, você deve fazer o seguinte:

FuncionarioGui f = new  FuncionarioGui();
win.setContentPane(f); // troca a área interna da sua janela para o painel de funcionarios
I

Eu também tenho uma dúvida quanto essa relação entre paineis em uma mesma janela.
Minha janela principal exibe os botões para que o usuário escolha uma determinada opção de diversos assuntos distintos que compões o sistema, exemplo:

-JanelaPrincipal (Agenda)
–JButton’s
—> Cadastrar Pessoa
—> Consultar Pessoa
—> Cadastrar Evento
—> Consultar Evento
—> Consultar Calendário

Todas essas opções estão disponíveis para serem realizadas sempre na mesma JFrame (sem ficar recriando JFrame novo a cada nova tela).

Se clicar em “Cadastrar Pessoa” a seqüência a ser realizada seria esta:

  1. Mostrar painel de cadastro pessoa. O usuário preenche e clica no botão “Cadastrar”;
  2. Se feito com sucesso, mostrar painel de “Sucesso”. Caso contrário, se mantem no mesmo painel apenas exibindo a mensagem de erro;
  3. Caso opção 2 seja concretizada, então um botão de “Cadastrar Evento” é habilitado no painel de “Sucesso”;
  4. Caso o usuário queira cadastrar um evento, então clica-se em “Cadastrar Evento”. Então é mostrado o painel de cadastro de evento;

Veja, a minha pergunta é simples: Esses painéis devem estar em classes diferentes quando o assunto é diferente (“Pessoa” diferente de “Evento”) ou todos os painéis devem ficar juntos em uma mesma classe onde também estará a instancia do JFrame? :roll:
Se forem ficar separados, quem é responsável pelo controle de fluxos de tela de forma que os painéis distintos não fiquem extremamente acoplados com outros (painel instanciando painel)? :roll:
Teria que passar a instancia do JFrame para cada classe de painel separada para que eles sejam sempre exibidos no mesmo JFrame? :idea:

Obrigada! :smiley:

M

Veja:

Toda a API do Swing segue os conceitos de MVC.

No caso da visualização de dados, essa imagem diz tudo. O modelo (por exemplo a classe Pessoa) será exibido pela visão. Nesse caso, em especial, o controlador não tem uma utilidade específica.

Já no caso de inserção de dados (que é o seu caso), a visão será um formulário de preenchimento (inicialmente em branco) e o controlador será responsável por receber eventos da visão. Especificamente falando, sua classe de controlador implementará ActionListener. Quando o botão “Cadastrar” na visão for pressionado, o controlador será notificado; ele deve ler os dados e atualizar o modelo, criando um novo objeto Pessoa e o incluindo em um banco de dados se necessário.

Respondendo às suas perguntas:

Não há uma regra para isso, mas por questão de organização é recomendável mantê-las em classes separadas.

O controlador, que deve ler os dados inseridos na visão, atualizar o modelo e definir o que será exibido pela visão (por exemplo, a tela de sucesso ou de erro).

Não. Mas teria que passar sua janela para o controlador alterar os painéis conforme necessário (se fizer isso por meio de uma interface o acoplamento será menor).

Criado 6 de julho de 2010
Ultima resposta 9 de jul. de 2010
Respostas 4
Participantes 3