Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ricardo gomes araujo

[Resolvido] GetContentPane - Não mostra componentes

Recommended Posts

Pessoal,

 

Fiz o seguinte código usando métodos

 

package br.com.form;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

//public class TesteView extends JFrame {   

public class TesteView extends JFrame{

   private static final long serialVersionUID = 1L;
   private JFrame janela;
private JPanel painelPrincipal;
   private JLabel lb_moto, lb_carro, lb_custo;  
private JTextField tf_moto, tf_carro, tf_custo;    
private JComboBox cb_andamento;
private JButton bt_salvar, bt_limpar, bt_fechar;

public static void main(String[] args) {
	new TesteView().montaTela();
}

private void montaTela() {
	montaJanela();
	montaPainelPrincipal();
	mostraJanela();
	montaComponentes();
	adicionaComponentes();
}

private void montaJanela() {
	janela = new JFrame("Cadastro");
	janela.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

private void montaPainelPrincipal() {
	painelPrincipal = new JPanel();
	janela.add(painelPrincipal);
}

private void mostraJanela() {
	janela.pack();
	janela.setSize(550,450);
	janela.setVisible(true);
}

private void montaComponentes() {

	lb_carro    			= new JLabel("Carro");     
       lb_moto  				= new JLabel("Moto");     
       lb_custo   				= new JLabel("Custo");
       tf_carro 				= new JTextField("");     
       tf_moto     			= new JTextField("");
       tf_custo   				= new JTextField(""); 
       cb_andamento          	= new JComboBox();     
       bt_salvar      			= new JButton("Salvar");     
       bt_limpar      			= new JButton("Limpar");     
       bt_fechar     			= new JButton("Fechar");     

       cb_andamento.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Selecione a situação","Iniciado", "Finalizado", "Em andamento"}));

     janela.setLayout(null);

	getContentPane().add(lb_carro);    //erro aqui quando tira o extends JFrame
       getContentPane().add(lb_moto);     
       getContentPane().add(lb_custo);
       getContentPane().add(tf_carro);             
       getContentPane().add(tf_moto);     
       getContentPane().add(tf_custo);
       getContentPane().add(bt_salvar);     
       getContentPane().add(bt_limpar);     
       getContentPane().add(bt_fechar);   
 }

private void adicionaComponentes() {

	lb_carro    			.setBounds(250, 83, 100, 15); 
       lb_moto    				.setBounds(250, 100, 100, 25);  
       tf_carro    			.setBounds(400, 100, 80, 25); 
       tf_moto    				.setBounds(400, 100, 80, 25);
       lb_custo     			.setBounds(20, 140,300, 15); 
       tf_custo        		.setBounds(20, 160,80, 25); 
       cb_andamento        	.setBounds(20, 230,250, 25); 
       bt_salvar       		.setBounds(20,290,80, 30);  
       bt_limpar       		.setBounds(105,290,80, 30);
       bt_fechar       		.setBounds(190,290,80, 30); 
}


}

 

Só que ele não mostra os componentes na tela o que esta errado?

Alguém poderia me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem que chamar o frame numa thread separada. Tenta implementar seu método main da seguinte maneira:

public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
     public void run() {
        TesteView frame = new TesteView();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
     }
  });
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem muita coisa acontecendo por ai, mas vamos aos poucos. O ponto principal eh: repare que no seu metodo montaJanela() você cria um objecto JFrame e atribui a variavel janela a referencia desse objeto, e quando você chama getContentPane() na verdade você nao está adicionando no contentPane de "janela", mas sim no "this" que serah qualquer objeto criado atravez da sua classe TesteView, logo quando você chama o metodo montaTela, você estah mostrando "janela" que soh tem o "painelPrincipal" vazio e mais nada!

 

O que você deve fazer eh o seguinte: Troque todas chamadas a getContentPane().add() por painelPrincipal.add(), e em vez de colocar setLayout(null) em "janela", faca painelPrincipal.setLayout(null) pois ele serah o container dos componentes. Verifique a ordem de chamada dos metodos para montar a tela ( ceritifique que cada componente sera colocado na ordem certa, ou seja, primeiro adiciona o "painelPrincipal" na "janela" , depois coloque os componentes no "painelPrincipal" e finalmente mostre a "janela")..

 

A sequencia seria: montaJanela(), montaPainelPrincipal(), montaComponentes(), adicionaComponentes() e finalmente mostraJanela();

 

A dica que o vergil lhe deu eh necessaria apenas quando tiver uma outra Thread alterando o conteudo de um componente e por eles nao serem thread-safe eh aconselhavel colocar na fila de despacho de evento, usando SwingUtilities ou EventQueue, ou entao quando existe um processamento pesado que ocorre durante algum evento disparado por um componente que gui, para nao travar a interface aconselhavel executar noutra Thread...

 

Abraco, qualquer duvida poste ai, n se esqueca de colocar sempre como ficou o codigo depois das alteracoes feitas caso algo de errado volte a acontecer...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem muita coisa acontecendo por ai...

 

Você leu todo aquele código mal indentado? Parabéns! :lol: :clap:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui fiz um método para adicionaComponentes e dentro coloquei

 

janela.add(lb_moto);

 

Para adicionar os componentes no JFrame e funcionou

 

Tem muita coisa acontecendo por ai...

 

Você leu todo aquele código mal indentado? Parabéns! :lol: :clap:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.