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 já 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?