Valor digitado no campo JTextField não é recuperado

1 resposta
fgsl

Estou fazendo uma aplicação Swing para testar uma camada de acesso a banco de dados.

Tenho um cadastro de funcionários, que é uma tabela relacionada com diversas outras, referentes a localização do funcionário na hierarquia da empresa.

Então imaginei duas telas. A primeira mostra a lista de funcionários em um grid e tem botões pra incluir, alterar e excluir funcionários. Ok, essa parte está funcionando. Comecei então a implementar o tratamento dos eventos. Comecei com a exclusão que sempre é mais fácil. Deu certo. Agora parti para a inclusão.

Ao clicar no botão incluir, é construído um formulário com o seguinte método:

/**
	 * Método que mostra a tela de inclusão/alteração de funcionário
	 * @param idFuncionario
	 */
	private void editarRegistro(int idFuncionario)
	{
		this.janelaAtual = new JFrame((idFuncionario == 0 ? "Inclusão" : "Alteração") + "de Funcionário");
		
		JPanel panel = new JPanel(new GridBagLayout());		
				
		JTextField texto;
		
		JComboBox combo;
		
		JLabel rotulo;
		
		// grid: x = coluna y = linha		
		
		String[][] camposTexto = {
				{"Matrícula","matricula"},
				{"Nome","nome"},
				{"E-mail","email"},
				{"Ramal","ramal"}			
		};		
		
		//-----------------------------
		
		for (int i=0; i<4;i++)
		{
			rotulo = new JLabel(camposTexto[i][0]);
			rotulo.setName("");
			panel.add(rotulo,this.getGBC(0,i,0, GridBagConstraints.NORTHWEST));
			
			texto = new JTextField();
			texto.setName(camposTexto[i][1]);
			texto.setColumns(10);
			panel.add(texto,this.getGBC(1,i,GridBagConstraints.HORIZONTAL, GridBagConstraints.NORTHWEST));			
		}
		
		//-----------------------------
		
		String[][] camposCombo = {
				{"Regional","regional"},
				{"Superintendência","superintendencia"},				
				{"Departamento","departamento"},
				{"Divisão","divisao"},
				{"Setor","setor"},
				{"Supervisao","supervisao"},
				{"Local","local"}				
		}; 
		
		int[] DAOCombo = {REGIONAIS,SUPERINTENDENCIAS,DEPARTAMENTOS,DIVISOES,SETORES,SUPERVISOES,LOCAIS};
		
		for (int i=4; i<11;i++)
		{
			rotulo = new JLabel(camposCombo[i-4][0]);
			rotulo.setName("");
			panel.add(rotulo,this.getGBC(0,i,0, GridBagConstraints.NORTHWEST));
			
			combo = new JComboBox();
			combo.setName(camposCombo[i-4][1]);
			this.preencherCombo(combo,DAOCombo[i-4]);
			panel.add(combo,this.getGBC(1,i,GridBagConstraints.HORIZONTAL, GridBagConstraints.NORTHWEST));	
			
		}
		//-----------------------------				
		
		JButton botao;
		
		botao = new JButton("gravar");
		botao.setActionCommand("gravar," + idFuncionario);
		botao.addActionListener(this);
		
		panel.add(botao,this.getGBC(0,11,GridBagConstraints.HORIZONTAL, GridBagConstraints.NORTHWEST));			
		this.janelaAtual.add(panel);		
		this.janelaAtual.setSize(1024, 768);		
		
		this.janelaAtual.setVisible(true);
	}

Antes que perguntem, eu criei o método getGBC() pra retornar um objeto GridBagConstraints já configurado:

/**
	 * Retorna um objeto GridBagConstraints  configurado
	 * @param anchor
	 * @param fill
	 * @return
	 */
	private GridBagConstraints getGBC(int x, int y, int fill, int anchor){
		GridBagConstraints gbc = new GridBagConstraints();
		
        gbc.gridx 	= x;
        gbc.gridy 	= y;
        gbc.weightx = 1;
        gbc.weighty = 0;
        gbc.anchor 	= anchor;
        if (fill > 0)
        	gbc.fill 	= fill;
        gbc.insets 	= new Insets(5, 5, 0, 5);	
        
        return gbc;
	}

Bem, a tela acima é apresentada, normalmente. Como podem notar, há um botão gravar. Ele invoca o ActionPerformed. Eu colocarei abaixo só até o trecho onde o problema começa:

public void actionPerformed(ActionEvent e)
	{
		int idFuncionario = 0;
		
		if (e.getActionCommand().equals(INCLUIR))
		{
			this.editarRegistro(0);
			return;
		}		
		
		String[] comando;
		
		comando = e.getActionCommand().split(",");
		
		if (comando[0].equals(ALTERAR))
		{
			
		}
		if (comando[0].equals(GRAVAR))
		{
			Funcionario objFuncionario = new Funcionario();
			
			JRootPane frame = (JRootPane) this.janelaAtual.getComponent(0);			
			
			JLayeredPane layeredPane = (JLayeredPane)frame.getComponent(1);
			
			JPanel painel = (JPanel)layeredPane.getComponent(0);
			
			JPanel gb = (JPanel)painel.getComponent(0);		
			
			Component[] componentes = gb.getComponents();

Quando o botão gravar é pressionado, o ActionPerformed entra no case GRAVAR. Minha idéia e jogar os componentes visuais em uma matriz e em um loop, gravá-los no objeto POJO correspondente, usando a API de Reflection. Eu não quero ter que fazer a chamada dos métodos set um por um. Se o campo visual já contém o nome do atributo, posso montar o nome do método e chamar.

Só que quando eu debuguei o conteúdo de componentes, que são JLabels, JTextFields e JComboBox, o getText() dos dois últimos não retorna nada! Por que o valor que eu digitei na tela foi ignorado?

1 Resposta

fgsl

Bem, como não houve resposta, eu resolvi o problema de outra forma.
Criei dois atributos privados, um List para JTextFields e um para JTextCombos.

Eliminei o atributo janelaAtual.

Assim, conforme vou criando os elementos visuais, vou armazenando os campos editáveis nos Lists, e aí recupero direto. Isso reduziu o código inclusive.

Criado 10 de setembro de 2008
Ultima resposta 12 de set. de 2008
Respostas 1
Participantes 1