Dificuldades para entender o que acontece com JFrame, Jpanel e JMenuBar

3 respostas
daniel.lopes

Galera,

Sou super iniciante em Java e estou tentando aprender sozinho, praticamente. Já tenho uma janela pronta e funcionando. Nela eu tenho um JFrame, 4 JPanels e um JMenuBar. Nessa mesma classe está contido todos esses componentes, num linguição nojento, inclusive o MAIN.

Eu to querendo fazer o seguinte: transformar isso em classes separadas: uma classe só com o main, que vai chamar as classes:

  • Conteudo: com os panels que já existem. nesta classe haverá apenas esses JPanels.
  • MenuGeral: com o menu já criado no linguição, que futuramente vou implementar os actions para chamar outros JPanels a serem atualizados na tela principal.
  • Main: onde estará a classe main que vai chamar as outras classes para montar a janela.

Passei a tarde toda quebrando a cabeça e consigo fazer duas coisas apenas:
-Pelo MAIN montar apenas a Janela com o Menu ou
-Pelo MAIN montar apenas a Janela com os Panels.

Não estou conseguinto, através da classe que tem o MAIN, montar que seja uma nova janela com o menu e o Panel juntos.

Estou com muita dificuldade para entender alguns conceitos e por causa dessas cabeçadas até mesmo fazendo confusão com a pouca coisa que já aprendi…

Me ajudem, por favor!!!

[]s

Daniel.

3 Respostas

_Renatu

Voce pode postar seu codigo pra gente te ajudar…

mas basicamente é só juntar o código que coloca os panels com o que coloca o menu…

aqui tem um tutorial da sun sobre janelas:
http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html

e aqui sobre menus:
http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html

tenta entender como funciona, é só voce ir adicionando a sua instancia de JFrame com os metodos certos

Se nao conseguir mesmo assim, posta seu código pra gente ver…

daniel.lopes

_Renatu:
Voce pode postar seu codigo pra gente te ajudar…

mas basicamente é só juntar o código que coloca os panels com o que coloca o menu…

aqui tem um tutorial da sun sobre janelas:
http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html

e aqui sobre menus:
http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html

tenta entender como funciona, é só voce ir adicionando a sua instancia de JFrame com os metodos certos

Se nao conseguir mesmo assim, posta seu código pra gente ver…

segue o código… vou tentar fazer alguns comentários claros:

/**
 * Classe reescrita com referência ao documento "Eventos.pdf".
 * O construtor quem faz toda a montagem da janela.
 * 
 * O main cria o frame, define o tamanho e comportamento
 * 
 */


/**
 * @author dlopes
 *
 */

package pacoteTeste;


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


public class CadCargo01 extends JFrame{
    
    //criando as variaveis para o menu
    private JMenuBar barraDeMenu;
    private JMenu menu, subMenu;
    private JMenuItem menuItem;
    private JRadioButtonMenuItem rbMenuItem;
    private JCheckBoxMenuItem cbMenuItem;
    
    
    //criando as variávels para os Labels
    private JLabel cargoLabel;
    private JLabel titleLabel;
        
    //criando as Strings para os Labels
    private String titleLabelString = "Cadastro / Alteração de Monitores de" +
    		" Video";
    private String cargoLabelString = "Cargo: ";
    
    
    //criando as variáveis para os TextFields
    private JTextField cargoTextField;
    
        
    //criando as variáveis para os Buttons
    private JButton confirmaButton;
    private JButton voltarButton;
             
    //criando as Strings para os Buttons
    private String confirmaButtonString = "Confirma";
    private String voltarButtonString = "Voltar";
    
    
    //criando as variaveis para os Panels
    private JPanel geralPanel, labelPanel, textFieldPanel, buttonPanel, titlePanel;
    
    
    //criando a variavel do container
    private Container geralContainer;
    
        
    public CadCargo01(String tituloDaJanela){
		
	super(tituloDaJanela);
	
	//instanciando apenas a barra de menu
	barraDeMenu = new JMenuBar();
		
	//menu consulta
	menu = new JMenu("Consulta");
	barraDeMenu.add(menu);
			
	menuItem = new JMenuItem("Cargo");
	menu.add(menuItem);
		
	menuItem = new JMenuItem("Ap. Telefônico");
	menu.add(menuItem);
		
	menuItem = new JMenuItem("Computadores");
	menu.add(menuItem);
		
	//adicionando uma linha separadora no menu
	menu.addSeparator();
		
	menuItem = new JMenuItem("Email");
	menu.add(menuItem);
		
	menuItem = new JMenuItem("Ramal");
	menu.add(menuItem);
	
	//adicionando uma linha separadora no menu
	menu.addSeparator();
		
	//criando um grupo de radio Buttons em Menu Item
	ButtonGroup rbGroup = new ButtonGroup();
	rbMenuItem = new JRadioButtonMenuItem("Radio button teste 01");
	rbMenuItem.setSelected(true);
	rbGroup.add(rbMenuItem);
	menu.add(rbMenuItem);
		
	rbMenuItem = new JRadioButtonMenuItem("Radio button teste 03");
	rbGroup.add(rbMenuItem);
	menu.add(rbMenuItem);
		
	rbMenuItem = new JRadioButtonMenuItem("Radio button teste 02");
	rbGroup.add(rbMenuItem);
	menu.add(rbMenuItem);
		
	//adicionando uma linha separadora no menu
	menu.addSeparator();
		
	//criando um grupo de Check Box em Menu Item
	cbMenuItem = new JCheckBoxMenuItem("Check Box teste 02");
	menu.add(cbMenuItem);
		
	cbMenuItem = new JCheckBoxMenuItem("Check Box teste 01");
	menu.add(cbMenuItem);
		
	//adicionando uma linha separadora no menu
	menu.addSeparator();
		
	//criando um submenu
	subMenu = new JMenu("Sub de Teste");
	menuItem = new JMenuItem("subItem 01");
	subMenu.add(menuItem);
		
	menuItem = new JMenuItem("subItem01");
	subMenu.add(menuItem);
		
	menu.add(subMenu);
	
		
	//menu dica do dicas
	menu = new JMenu("Dicas Gerais");
	barraDeMenu.add(menu);
		
	menuItem = new JMenuItem("Computadores");
	menu.add(menuItem);
		
	menuItem = new JMenuItem("Internet");
	menu.add(menuItem);
			
	//colocando a barra de menus no Frame
	setJMenuBar(barraDeMenu);
		
		
	//criando o conteudo do painel
	//instanciando os Labels recebendo suas variaveis do tipo
	//String como parametro
	titleLabel = new JLabel(titleLabelString);
	cargoLabel = new JLabel (cargoLabelString);
	    
	//instanciando os TextFields passando o tamanho do campo como arametro
	cargoTextField = new JTextField(50);
	    
	//instanciando os Buttons
	confirmaButton = new JButton(confirmaButtonString);
	voltarButton = new JButton(voltarButtonString);
	    
	 //assossiando os Labels com os TextFields
	 cargoLabel.setLabelFor(cargoTextField);
	    
	 //criando Panel para os Labels de TextFields e os adicionando
	 labelPanel = new JPanel(new GridLayout(0, 1));
	 labelPanel.add(cargoLabel);
	    
	 //criando Panel para os TextFields e os adicionando
	 textFieldPanel = new JPanel(new GridLayout(0, 1));
	 textFieldPanel.add(cargoTextField);
	    
	 //criando Panel para os botoes e os adicionando
	 buttonPanel = new JPanel ();
	 buttonPanel.add(confirmaButton);
	 buttonPanel.add(voltarButton);
	   
	 //criando panel para o titulo da janela e o adicionando
	 titlePanel = new JPanel();
	 titlePanel.add(titleLabel);
	    
	 //criando painel geral para adicionar os outros paineis dentro
	 geralPanel = new JPanel();
	 geralPanel.setLayout(new BorderLayout());
	    
	 //seta a borda do panel (up, left, down, right)
	 geralPanel.setBorder(BorderFactory.createEmptyBorder(30, 10, 30, 10));
	    
	 //seta o layout dos panels internos
	 geralPanel.add(buttonPanel, BorderLayout.PAGE_END);
	 geralPanel.add(labelPanel, BorderLayout.LINE_START);
	 geralPanel.add(textFieldPanel, BorderLayout.AFTER_LINE_ENDS);
	 geralPanel.add(titlePanel, BorderLayout.PAGE_START);
	    
	 //colocando o painel principal dentro do container
	 geralContainer = getContentPane();
	 geralContainer.add(geralPanel);

    }
    
    public static void main (String Args[]){
    	
    	JFrame frame = new CadCargo01("Titulo da Janela");
    	
    	//atribui evento ao clicar no X
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	
    	//ajusta a janela para o tamanho dos componentes
    	//frame.pack(); 
    	
    	//ajusta a tela independente do tamanho dos componentes
    	frame.setSize(840, 250);
    	
    	//seta a janela como visible.
    	frame.setVisible(true);
    }
    
   
    
}

Pois bem, esse linguição roda perfeitamente. Notem que ainda não trabalhei com os action listeners, try/catch, tratamento de exceptions ou com singleton. Gostaria de entender primeiro a possibilidade de pegar esse linguição acima (uma unica classe) e transformá-lo em 3 classes, pelo menos para esta primeira tentativa. Conseguindo isso acrescento os action listeners e elegancia na programação. Gostaria de transformar isso em 3 classes como segue, mas estou com dificuldades em fazer funcionar. Ora consigo apenas abir o menu, ora apenas o panel, mas nunca os dois:

classeMain - que terá apenas o main para chamar as outras classes e montar a janela;

classeMenu - que terá apenas as instruções de menu,  que esse será igual para quantas janelas futuramente forem feitas;

classeJanelas - seriam as classes com seus respectivos panels e container, cada qual montado com base à sua funcionalidade.

Assim, rodando o main, este chamaria as demais classes, montando a UI para ser utilizada. Adiante, com a implementação de eventos nos menus e botoes, o usuario navegaria pelo programa.

Sei que o código acima pode ser melhorado e muito, mas ainda sou novato em java e gostaria de ter alguns conceitos bem detalhados, para não apenas mais um dos que só copiam código. Sei que por aqui passam bons programadores que poderiam me ajudar a entender o funcionamento de tudo isso.

Agradeço qualquer ajuda!

Abraços,

Daniel.

daniel.lopes

Pessoal, consegui o que queria. Embora ainda sem tantas explicações e com algumas dúvidas sobre o que está acontecendo com o código, consegui o que queria: 3 classes diferentes para montar uma janela. Olha como ficou:

Primeiro, uma classe do tipo JPanel, como qualquer outra que haverá futuramente, caso seja necessário:

import javax.swing.*;

public class Panel extends JPanel{
    
    //definindo as variaveis do painel
    private JPanel painelGeral;
    private JLabel rotulo;
    
    //definindo o construtor
    public Panel(){
		
        //instanciando os componentes
        painelGeral = new JPanel();
        rotulo = new JLabel("TESSSTESSSSSS");
	
        //adicionando o rótulo ao painel
        painelGeral.add(rotulo);
	
        //essa linha é necessária para o main, mas ainda não sei explicar
        //o que ela faz exatamente.
        add(painelGeral);

    }
  
}

Agora, a classe que contem o menu que será usando por qualquer outra nova janela a ser criada:

import javax.swing.*;

public class Menu extends JMenuBar{
    
	//definindo as cariaveis utilizadas no menu
    private JMenuBar barraDeMenu;
    private JMenu menu, subMenu;
    private JMenuItem menuItem;
    
    public Menu(){
		//instanciando o objeto do menu
		barraDeMenu = new JMenuBar();
		
		//criando todo o Menu01 com seus items
		menu = new JMenu("Menu01");
		barraDeMenu.add(menu);
			
		menuItem = new JMenuItem("Menu01_Item01");
		menu.add(menuItem);
		
		menuItem = new JMenuItem("Menu01_Item02");
		menu.add(menuItem);
		
		//adicionando uma linha separadora
		menu.addSeparator();
		
		//adicionando um submenu ao Menu01
		subMenu = new JMenu("Menu01_Sub01");
		
		//adicionando um item ao submenu
		menuItem = new JMenuItem("Menu01_Sub01_Item01");
		subMenu.add(menuItem);
		menu.add(subMenu);
			
		//essa linha é necessária para o main, mas ainda não sei explicar
		//o que ela faz exatamente.
		add(menu);
		
		
		
		//criando todo o Menu02 com seus items
		menu = new JMenu("Menu02");
		barraDeMenu.add(menu);
		
		menuItem = new JMenuItem("Menu02_Item01");
		menu.add(menuItem);
		
		//adicionando uma linha separadora
		menu.addSeparator();
		
		//adicionando um submenu ao Menu01
		subMenu = new JMenu("Menu02_Sub01");
		
		//adicionando um item ao submenu
		menuItem = new JMenuItem("Menu02_Sub01_Item01");
		subMenu.add(menuItem);
		menu.add(subMenu);
		
		
		//essa linha é necessária para o main, mas ainda não sei explicar
		//o que ela faz exatamente.
		add(menu);
	
    }
    
}

E por fim, a classe MAIN que ira criar o primeiro JFrame e instanciar o Panel e o Menu

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;

public class Main {
	
    public static void main(String[] Args){
    	
    	//instanciando o frame para esta classe main e definindo o titulo
    	JFrame frame = new JFrame("RODANDO APENAS A CLASSE MAIN");
    	
    	//instanciando o painel como novo Panel para este frame main
    	JPanel painel = new Panel();
    	
    	//instanciando o menu como novo Menu para o mesmo frame main
    	JMenuBar menu = new Menu();
    	
    	
    	//adicionando o panel no frame
    	frame.getContentPane().add(painel);
    	
    	//definindo o menu no frame 
    	frame.setJMenuBar(menu);
    	
    	
    	//atribui evento ao clicar no X da janela
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	
    	//ajusta a tela independente do tamanho dos componentes
    	frame.setSize(840, 250);
    	
    	//seta a janela como visible.
    	frame.setVisible(true);
    }

}

Como já disse, sou novatíssimo em Java / Swing (aliás, até mesmo em Programação, estou no segundo semestre em CC) e gostaria muito que os colegas comentassem esse primeiro trabalho que fiz. Ainda não coloquei os eventos para os menus e nem utilizei de recursos que deixariam o programa mais eficiente e elegante, porém tudo isso está em meus planos para essa semana.

Ao final, quero ter um programa que , a partir dos menus, o usuario possa fazer uma simples consulta a um banco de dados, inclusão, alteração e exlusão de dados, tanto por menus quanto por botões.

Ao moderador do forum, gostaria de saber se há algum local aqui para eu postar o progresso. Acho que todo esse material, comentado pelos colegas muito mais experientes que eu, seria de grande ajuda para outros tantos novatos que passam por aqui e têm as mesmas dificuldades que estou tendo.

Grande abraço aos colegas,

Daniel Lopes.

Criado 22 de novembro de 2007
Ultima resposta 25 de nov. de 2007
Respostas 3
Participantes 2