Galera, eu to tentando aqui, já faz um tempo e ta osso… Como eu faço para ao se clicar numa coluna ou linha de um Jtable, um Jpainel ganhar foco?
Eu ja tenho um evento de mouseClicked que ao clicar na tabela, ele já leva as informações para os campos corretamente, só não consigo fazer dar foco no Jpainel.
Que tal assim?
Mas coloca uma borda no seu JPanel e, quando requisitar o focus, muda a cor da borda… Talvez fique bacana
A
akira191
Opa Nicolas beleza?
valeu a dica, mas eu já havia tentado isso e não rolou... porque quando ele pesquisa exibe num Jtable que está em um painel. Quando eu clico no jtable, ele preenche os campos corretamente no outro jPainel, só que não dá foco...
ta assim:
privatevoidpesquisajTableMouseClicked(java.awt.event.MouseEventevt){intlinha=pesquisajTable.getSelectedRow();numeroChamadojTextField.setText(pesquisajTable.getValueAt(linha,0).toString()); try{
sgtiBanco.executaSQL("select DescricaoCategoria, Loja, Pessoa, MotivoChamado, DescricaoChamado, Usuario,"+"HoraAbertura, HoraFechamento, DataCadastro, Finalizado from Chamados where "+"IdChamado = '"+numeroChamadojTextField.getText()+"';");sgtiBanco.resultset.first();categoriajComboBox.setSelectedItem(sgtiBanco.resultset.getString("DescricaoCategoria"));lojajComboBox.setSelectedItem(sgtiBanco.resultset.getString("Loja"));pessoajComboBox.setSelectedItem(sgtiBanco.resultset.getString("Pessoa"));motivoChamadojTextField.setText(sgtiBanco.resultset.getString("MotivoChamado"));descricaojTextArea.setText(sgtiBanco.resultset.getString("DescricaoChamado"));userjLabel.setText(sgtiBanco.resultset.getString("Usuario"));hora1jLabel.setText(sgtiBanco.resultset.getString("HoraAbertura"));jLabel.setText(sgtiBanco.resultset.getString("Horafechamento"));data1jLabel.setText(sgtiBanco.resultset.getString("DataCadastro"));if(sgtiBanco.resultset.getString("Finalizado").equals("A"))abertojRadioButton.setSelected(true);elsefechadojRadioButton.setSelected(true);}
catch(SQLExceptionerro){
JOptionPane.showMessageDialog(null,"Problemas para editar \n"+erro);}
}
Nicolas_Fernandes
akira191:
Opa Nicolas beleza?
valeu a dica, mas eu já havia tentado isso e não rolou... porque quando ele pesquisa exibe num Jtable que está em um painel. Quando eu clico no jtable, ele preenche os campos corretamente no outro jPainel, só que não dá foco...
ta assim:
privatevoidpesquisajTableMouseClicked(java.awt.event.MouseEventevt){intlinha=pesquisajTable.getSelectedRow();numeroChamadojTextField.setText(pesquisajTable.getValueAt(linha,0).toString()); try{
sgtiBanco.executaSQL("select DescricaoCategoria, Loja, Pessoa, MotivoChamado, DescricaoChamado, Usuario,"+"HoraAbertura, HoraFechamento, DataCadastro, Finalizado from Chamados where "+"IdChamado = '"+numeroChamadojTextField.getText()+"';");sgtiBanco.resultset.first();categoriajComboBox.setSelectedItem(sgtiBanco.resultset.getString("DescricaoCategoria"));lojajComboBox.setSelectedItem(sgtiBanco.resultset.getString("Loja"));pessoajComboBox.setSelectedItem(sgtiBanco.resultset.getString("Pessoa"));motivoChamadojTextField.setText(sgtiBanco.resultset.getString("MotivoChamado"));descricaojTextArea.setText(sgtiBanco.resultset.getString("DescricaoChamado"));userjLabel.setText(sgtiBanco.resultset.getString("Usuario"));hora1jLabel.setText(sgtiBanco.resultset.getString("HoraAbertura"));jLabel.setText(sgtiBanco.resultset.getString("Horafechamento"));data1jLabel.setText(sgtiBanco.resultset.getString("DataCadastro"));if(sgtiBanco.resultset.getString("Finalizado").equals("A"))abertojRadioButton.setSelected(true);elsefechadojRadioButton.setSelected(true);}
catch(SQLExceptionerro){
JOptionPane.showMessageDialog(null,"Problemas para editar \n"+erro);}
}
Fala, Akira!
1. Tá... Porque foco no JPanel? Não seria mais legal dar foco no primeiro campo preenchido, por exemplo, no campo de nome?
2. Você sabe programar com a arquitetura MVC? Lógicas de negócio e acesso à dados estão misturados com códigos da View, e isso não é legal. Seria interessante dividir isso em um modelo MVC!
3. Use o PreparedStatement ao invés de concatenar os parâmetros na sua query. Evita SQL Injections e elimina a necessidade de colocar aspas simples para as Strings.
4. NÃO USE DefaultTableModel! Isso gera uma série de implicações a você, uma das quais é não trabalhar diretamente com objetos!
Valeu, abraços!
A
akira191
Rapa, estudar o negócio e ter que fazer milagres é osso…
tenho noções, ainda sou estudante. Com calma chego la xD
mesmo assim valeu a ajuda, abraços !!
Nicolas_Fernandes
akira191:
Rapa, estudar o negócio e ter que fazer milagres é osso…
tenho noções, ainda sou estudante. Com calma chego la xD
mesmo assim valeu a ajuda, abraços !!
Relaxa que o bicho não é de sete cabeças assim…
Eu também sou estudante, mas eu ralei e aprendi essas coisas, muitas aqui pelo GUJ! >.<
E você ainda não respondeu porque dar foco no Panel, ao invés de dar em um componente dele… Tipo, dar o foco no primeiro JTextField, saca?
Você pode fazer algo assim:
Crie um modelo pra sua JTable (siga o link da minha assinatura para melhores informações!):
// Estou supondo que você criou um Bean para a entidade Chamados!publicclassChamadosTableModelextendsAbstractTableModel{privateList<Chamado>chamados=newArrayList<Chamado>();privatestaticfinalintcolunaCategoria=0;privatestaticfinalintcolunaLoja=1;privatestaticfinalintcolunaPessoa=2;privatestaticfinalintcolunaMotivoChamado=3;publicChamadosTableModel(List<Chamado>chamados){this.chamados=chamados;}publicStringgetColumnName(intcolumn){if(column==colunaCategoria)return"Categoria";if(column==colunaLoja)return"Loja";if(column==colunaPessoa)return"Pessoa";if(column==colunaMotivoChamado)return"Motivo do Chamado";return"";}publicClassgetColumnClass(intcolumn){returnString.class;}publicObjectgetValueAt(introw,intcolumn){Chamadochamado=chamados.get(row);if(column==colunaCategoria)returnchamado.getCategoria();if(column==colunaLoja)returnchamado.getLoja();if(column==colunaPessoa)returnchamado.getPessoa();if(column==colunaMotivoChamado)returnchamado.getMotivoChamado();return"";}// Esse método busca um registro específico da tabela.publicChamadobuscarRegistro(introw){returnchamados.get(row);}}
Coloque um Listener na sua JTable que, ao selecionar um registro, ele busque os dados daquela linha:
// Busca uma lista dos chamados que você tem no banco de dados.List<Chamado>chamados=ChamadosDAO.buscarRegistros();// Cria um modelo pra sua tabela Chamados.ChamadosTableModelmodel=newChamadosTableModel(chamados);// Cria a tabela e seta o seu modelo.JTablechamadosTable=newJTable();chamadosTable.setModel(model);// Adicionar um Listener para o mouse, quando clicar em um registro.chamadosTable.addMouseListener(newMouseListener(){publicvoidmouseClicked(MouseEvente){if(e.getClickCount==1){// Busca o registro de uma linha específica.Chamadochamado=model.buscarRegistro(chamadosTable.getSelectedRow());preencherDadosPanel(chamado);}}});privatevoidpreencherDadosPanel(Chamadochamado){categoriaComboBox.setSelectedItem(chamado.getDescricaoCategoria());lojaComboBox.setSelectedItem(chamado.getLoja());pessoaComboBox.setSelectedItem(chamado.getPessoa());// E vai preenchendo...categoriaComboBox.requestFocus();// Assim, o seu foco está em um componente do painel, o primeiro, pro cliente já poder mexer nele, melhorando a usabilidade do sistema!}
Sacou mais ou menos?
A
akira191
poo brother coisa linda…,
Eu resolvi voltar a estudar e deixar esse negócio de lado um pouco, eu to inclusive olhando a sua assinatura também, aquele lance do jTable eh excelente.
Então descupa eu não havia dito, é porque assim: os dados estão na tabela em outro panel, que está dentro de um jTabbedPainel. Assim o que aconteceria: de um lado fica a parte do cadastro; do outro, esta tabela que lista o que já foi cadastrado anteriormente, e caso a pessoa desejar alterar algum dado, ela apenas vai dar um clique no item na tabela ( que eu ja consegui fazer preencher do outro lado ) e dar foco la.
mas valeu ae a ajuda, eu vou dar uma estudada melhor ae obrigado !!!