Olá pessoal, estou com problemas com Jtable.
Estou preenchendo a tabela com campos do banco de dados, só que preciso resgatar a linha selecionada para carregar o registro em outra tela para modificações. Eu queria pegar o id do registro mais não deixar ele aparecendo na tabela, como eu faço isso?
Obrigado!
[]'s
Como você está fornecendo os dados à tabela? Uma boa alternativa seria usar um TableModel contendo um ArrayList com os registros a exibir. Para saber o ID de qualquer deles, bastaria determinar a linha selecionada na JTable e em seguida usar esse valor para ler o elemento adequado no ArrayList do TableModel.
E ai cara . blz.
esse exemplo aqui retorna o valor do campo que esta selecionado…
nomeDaTabela.getValueAt(nomeDaTabela.getSelectedRow(), NumeroDaColunaQueVcQuer);
falow um abraço.
Estou passando um vetor para a tabela…
Você está usando DefaultTableModel?
Estou passando assim:
DefaultTableModel defaultTableModel = (DefaultTableModel) masterTable.getModel();
defaultTableModel.addRow(dados);
[]'s
Acho que agora entendi o que vc quer.
vc quer preencher uma tabela…mais não quer que um determinado atributo não apareça né mesmo?
se for isso…tenta assim…
quando vc criar o vetor…cria ele com um campo a mais…ou seja…
se a tabela. tem 2 colunas criar o vetor com tamanho 4 ai vc coloca o valor que vc quer na posição 3
quando vc for pegar o valor ai vc pega o Model da tabela…indicando a posição 3 do model…não da tabela
mais sim do Model…tenta isso…
Você tem que ter alguma maneira de associar a linha da JTable a um determinado ID do Banco de Dados. Você poderia criar um ArrayList para guardar os ID’s, e, a cada linha que adicionasse à JTable, adicionar também um ID ao ArrayList. Aí, para saber o ID selecionado, basta ler a linha selecionada com JTable.getSelectedRow() e em seguida usar essa linha com ArrayList.get() para obter o ID.
Você diz assim:
masterTable.getModel().getValueAt(masterTable.getSelectedRow(), 6))
Tentei mais ele da erro de java.lang.ArrayIndexOutOfBoundsException: 6 >= 6
[]'s
cara… dá uma olhada no ObjectTableModel feito pelo Mark_Ameba…
nele você dá getValue(numeroDaLinha) e ele te retorna o teu objeto inteiro… sem precisar pegar o código para fazer uma pesquisa no banco e sem a necessidade de listar todos os campos…
Provavelmente esta dando erro porque esta fora do indice da tabela, verifique se é esta coluna mesmo.
[quote=erico_kl]cara… dá uma olhada no ObjectTableModel feito pelo Mark_Ameba…
nele você dá getValue(numeroDaLinha) e ele te retorna o teu objeto inteiro… sem precisar pegar o código para fazer uma pesquisa no banco e sem a necessidade de listar todos os campos…[/quote]
Apoiado.
Fora isso, estude como os dados vão para a tabela através do TableModel.
A coluna está certa, mais quando eu recupero usando valueAt o vetor está chegando sem a posição que eu quero.
[]'s
[quote=Mark_Ameba][quote=erico_kl]cara… dá uma olhada no ObjectTableModel feito pelo Mark_Ameba…
nele você dá getValue(numeroDaLinha) e ele te retorna o teu objeto inteiro… sem precisar pegar o código para fazer uma pesquisa no banco e sem a necessidade de listar todos os campos…[/quote]
Apoiado.
Fora isso, estude como os dados vão para a tabela através do TableModel.[/quote]
Se tem alguma coisa que me arrependo é não ter visto teu ObjectTableModel antes…
moço faz assim então…coloca o tamanho da colunas da tabelas 6 mesmo…
só que a ultimo onde vc esta o dados. o que vc faz…seta o tamanho maximo e minimo dela para 0
falow.
Não use DefaultTableModel!!!
Motivos:
- É mais difícil que escrever seu próprio TableModel;
- É mais lento (usa classes sincronizadas);
- Ocupa mais espaço em memória (duplica seus dados);
- Deixa o código mais confuso e difícil de manter;
- Usa casts inseguros;
- Força que você tenha que exibir informações desnecessárias (como o ID) na tabela, ou controlar o ID numa lista separada;
- Faz a sua mulher te deixar, o leite da sua geladeira azedar, e pessoas apontarem o dedo para você na rua.
2 curtidas
[quote=ViniGodoy]Não use DefaultTableModel!!!
Motivos:
- É mais difícil que escrever seu próprio TableModel;
- É mais lento (usa classes sincronizadas);
- Ocupa mais espaço em memória (duplica seus dados);
- Deixa o código mais confuso e difícil de manter;
- Faz a sua mulher te deixar, o leite da sua geladeira azedar, e pessoas apontarem o dedo para você na rua.[/quote]
:shock: Nossa! O último argumento eu não conhecia ainda…
Olá amigo
uma rotina que desenvolvi:
chamda da consulta:
private void jButtonPesquisaClienteActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Consultacliente.setNome(tfNomeCliente.getText());
Consultacliente consultaCliente = new Consultacliente(null);
consultaCliente.setModal(true);
consultaCliente.setVisible(true);
id_cliente = consultaCliente.getCodigo();
try {
if (!id_cliente.equals(null)) {
selecionaCliente();
}
else {
tfIdCliente.requestFocus();
}
} catch (Exception ex) {
Logger.getLogger(FrameOrdemServicoOld.class.getName()).log(Level.SEVERE, null, ex);
}
}
agora na tela de consulta:
/*
* Consultacliente.java
*
* Created on 24 de Agosto de 2008, 19:48
*/
package assistenciadesktop;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.sql.*;
import java.util.*;
import java.awt.GridLayout;
import assistenciadesktop.FrameClientes_old;
import bd.ConexaoBancoDados;
import javax.swing.event.AncestorListener;
import javax.swing.table.DefaultTableModel;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.lang.Object;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
/**
*
* @author Silvio Guedes
*/
public class Consultacliente extends javax.swing.JDialog {
//private JTable jTable = null;
private java.sql.Statement stmt;
public int linhastabela;
public Object Codigo;
private boolean okSelecionado;
static String nomeConsulta;
/** Creates new form Consultacliente */
public Consultacliente(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
}
Consultacliente(Object object) {
try {
initialize();
} catch (ClassNotFoundException ex) {
Logger.getLogger(Consultacliente.class.getName()).log(Level.SEVERE, null, ex);
}
}
public Object getCodigo() {
return Codigo;
//throw new UnsupportedOperationException("Not yet implemented");
}
public static void setNome(String Nome) {
nomeConsulta = Nome;
}
public String getNome() {
return nomeConsulta;
}
public boolean SelecionaDados()
{
okSelecionado = false; //Marcamos que o ok não foi selecionado
setModal(true); //A dialog tem que ser modal. Só pode retornar do setVisible após ficar invisível.
setVisible(true); //Mostramos a dialog e esperamos o usuário escolher alguma coisa.
return okSelecionado; //Retornamos true, se ele pressionou ok.
}
private void mostrarResultados(ResultSet rs) throws SQLException, ClassNotFoundException {
Statement statement;
String[] tableColumnsName = {"", "Código", "Nome", "Fone"};
final DefaultTableModel aModel = new DefaultTableModel(tableColumnsName, 0) {
@Override
public Class getColumnClass(int column) {
Class returnValue;
if ((column >= 0) && (column < getColumnCount())) {
if (getValueAt(0, column) != null) {
returnValue = getValueAt(0, column).getClass();
} else {
returnValue = Object.class;
}
} else {
returnValue = Object.class;
}
return returnValue;
}
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
};
if (linhastabela == 0) {
JOptionPane.showMessageDialog(this, "Nehum registro encontrado");
return;
}
else {
final JTable jTable = new JTable();
JScrollPane jScrollPane = new JScrollPane(jTable);
getContentPane().add(jScrollPane,java.awt.BorderLayout.CENTER);
aModel.setColumnIdentifiers(tableColumnsName);
java.sql.ResultSetMetaData rsmd = rs.getMetaData();
int colNo = rsmd.getColumnCount();
while(rs.next()){
Object[] objects = new Object[colNo];
objects[0] = rs.getObject(1);
objects[1] = rs.getObject(2);
objects[2] = rs.getObject(3);
objects[3] = rs.getObject(4);
aModel.addRow(objects);
}
jTable.setModel(aModel);
jTable.setFillsViewportHeight(true);
jTable.getTableHeader().setReorderingAllowed(false);
jTable.getColumnModel().getColumn(0).setWidth(0);
jTable.getColumnModel().getColumn(0).setPreferredWidth(0);
jTable.getColumnModel().getColumn(1).setPreferredWidth(50);
jTable.getColumnModel().getColumn(2).setPreferredWidth(300);
jTable.getColumnModel().getColumn(3).setPreferredWidth(100);
jTable.setAutoCreateRowSorter(true);
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(jTable.getModel());
jTable.setRowSorter(sorter);
jTable.getColumnModel().removeColumn( jTable.getColumnModel().getColumn(0));
jTable.getSelectionModel().setSelectionInterval(0, 0);
jTable.requestFocusInWindow();
jTable.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
if (e.getClickCount() == 2){
// Listaclientes.id = jTable.getModel().getValueAt(jTable.getSelectedRow(),0);
Codigo = jTable.getModel().getValueAt(jTable.getSelectedRow(),0);
dispose();
}
}
});
}
}
private void getJTable() throws ClassNotFoundException, ClassNotFoundException{
Statement statement;
ResultSet result;
try {
stmt = bd.ConexaoBancoDados.conexao().createStatement();
String query = "select id,id,nome,telefone from clientes where upper(nome) ilike "+"upper('%"+
nomeConsulta+"%') order by nome";
ResultSet rs = stmt.executeQuery(query);
mostrarResultados(rs);
stmt.close();
}
catch (SQLException sqlex) {sqlex.printStackTrace();}
}
private void initialize() throws ClassNotFoundException {
ResultSet rst;
this.setSize(600,400);
Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((tela.width-this.getSize().width)/2,
(tela.height-this.getSize().height)/2);
nomeConsulta = this.getNome();
try {
stmt = bd.ConexaoBancoDados.conexao().createStatement();
String query = "select count(*) from clientes where upper(nome) ilike "+"upper('%"+
nomeConsulta+"%')";
rst = stmt.executeQuery(query);
while(rst.next()){
Object[] objects = new Object[1];
objects[0] = rst.getObject(1);
linhastabela = rst.getInt(rst.getRow());
}
stmt.close();
} catch (SQLException ex) {
Logger.getLogger(Consultacliente.class.getName()).log(Level.SEVERE, null, ex);
}
getJTable();
this.setTitle("Clientes");
this.setDefaultCloseOperation(Consultacliente.DISPOSE_ON_CLOSE);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setName("Form"); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
pack();
}// </editor-fold>//GEN-END:initComponents
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Consultacliente dialog = new Consultacliente(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
}
Boa Sorte!
Silvio Guedes
Bom saber. Nunca vou usar DefaultTableModel.
Quem usa DefaultTableModel não arranja namorada :lol: