Opa…
Colega, vc consegue ter controle sobre a JTable sim, mesmo fazendo a GUI no NetBeans (eu uso o NetBeans aqui).
Vamos lá… com relação ao meu exemplo, esse eu fiz na mão mesmo, mas o mais importante lá são os métodos…
Vamos por partes: (vou usar um exemplo real aqui, de um programinha que fiz)
Primeiramente, eu te aconselho a criar um método que faça a consulta, e retorne para você um List com as informações:
exemplo:
public List<Evento> obterEventos() throws SQLException, Exception{
Evento umEvento = null;
List<Evento> eventos = new ArrayList<Evento>();
DAOLancamento daoLancamento = new DAOLancamento();
try{
conn = factoryConexao.getConnection();
String SQL = "SELECT * FROM evento ORDER BY data DESC" ;
PreparedStatement stmt = conn.prepareStatement(SQL,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet resultSet = stmt.executeQuery();
while (resultSet.next()){
umEvento = new Evento();
umEvento.setId(resultSet.getInt("id"));
umEvento.setDescricao(resultSet.getString("descricao"));
umEvento.setData(resultSet.getDate("data"));
// o evento já sai com todos os seus lançamentos
umEvento.setLancamentos(daoLancamento.obterLancamentos(umEvento));
eventos.add(umEvento);
umEvento = null;
}
stmt.close();
}
finally{
conn.close();
return eventos;
}
}
Jóia?! Até aqui beleza, você só fez o suficiente para ter os dados em um List…
Agora, para ter um controle maior sobre seu JTable (mesmo que ele tenha diso criado com o NetBeans), você pode criar algumas classes que te auxiliam na personalização.
Vamos usar 3: uma que extenda DefaultTableCellRenderer, uma que extenda DefaultTableColumnModel, e uma que extenda AbstractTableModel.
a que extende DefaultTableCellRenderer…
/*
* CellRendererEvento.java
*
* Created on 22 de Março de 2006, 22:23
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.table.DefaultTableCellRenderer;
/**
*
* @author Luiz Gustavo Stábile de Souza
*/
public class CellRendererEvento extends DefaultTableCellRenderer {
public CellRendererEvento() {
super();
}
private Color getCellColor(){
return Color.BLACK;
}
public Component getTableCellRendererComponent(javax.swing.JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column){
JLabel label = (JLabel)super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
Color corFundoZebrado = new Color(240, 240, 240);
label.setFont(new java.awt.Font("Arial", 0, 12));
if((row % 2) == 0){
label.setBackground(Color.WHITE);
}
else{
label.setBackground(corFundoZebrado);
}
if(column == 0){
label.setHorizontalAlignment(CENTER);
}
else if(column == 1){
label.setHorizontalAlignment(LEFT);
}
else if(column == 2){
label.setHorizontalAlignment(RIGHT);
}
return label;
}
}
…lhe permite ter controle sobre a configuração de cada célula. Você pode colocar a cor da fonte de cada coluna de uma cor, fazer um grid zebrado (o que está sendo feito aqui), enfim, serve para configurar cada célula.
A que extende DefaultTableColumnModel …
import java.awt.FontMetrics;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;
/**
*
* @author Luiz Gustavo Stábile de Souza
*/
public class ColumnModelEvento extends DefaultTableColumnModel{
public ColumnModelEvento(FontMetrics fm) {
int digito = fm.stringWidth("0");
int letra = fm.stringWidth("M");
addColumn(criaColuna(0, 10 * letra, fm, false, "Cadastro"));
addColumn(criaColuna(1, 100 * letra, fm, true, "Descrição do Evento"));
addColumn(criaColuna(2, 15 * digito, fm, false, "Valor Total"));
}
private TableColumn criaColuna(int columnIndex, int largura, FontMetrics fm, boolean resizable, String titulo){
int larguraTitulo = fm.stringWidth(titulo + " ");
if (largura < larguraTitulo){
largura = larguraTitulo;
}
TableColumn col = new TableColumn(columnIndex);
col.setCellRenderer(new CellRendererEvento());
col.setHeaderRenderer(null);
col.setHeaderValue(titulo);
col.setPreferredWidth(largura);
if(!resizable){
col.setMaxWidth(largura);
col.setMinWidth(largura);
}
col.setResizable(resizable);
return col;
}
}
…lhe permite configurar quais colunas existirão na JTable:
addColumn(criaColuna(0, 10 * letra, fm, false, "Cadastro"));
addColumn(criaColuna(1, 100 * letra, fm, true, "Descrição do Evento"));
addColumn(criaColuna(2, 15 * digito, fm, false, "Valor Total"));
Observe este trecho:
col.setCellRenderer(new CellRendererEvento());
aqui é indicado que o ColumnModel deve usar, para configurar cada célula, o CellRenderer que foi criado anteriormente. Se você não estiver usando um CellRenderer (o que deixaria a JTable com uma aparência padrão), basta deixar o parâmetro como null.
A que extende AbstractTableModel…
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import javax.swing.table.AbstractTableModel;
/**
*
* @author Luiz Gustavo Stábile de Souza
*/
public class TableModelEventos extends AbstractTableModel{
private List<Evento> eventos;
private SimpleDateFormat simpleDateFormat;
public TableModelEventos(List<Evento> eventos) {
this.eventos = eventos;
simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
}
public Object getValueAt(int rowIndex, int columnIndex){
Evento umEvento = eventos.get(rowIndex);
switch(columnIndex){
case 0: return simpleDateFormat.format(umEvento.getData());
case 1: return umEvento.getDescricao();
case 2: return NumberFormat.getCurrencyInstance().format(umEvento.getValorTotal());
}
return null;
}
public int getRowCount(){
return eventos.size();
}
public int getColumnCount(){
return 3;
}
public Evento getValues(int rowIndex){
return eventos.get(rowIndex);
}
}
… é a classe que manipula os dados, onde você pode definir a formatação de cada informação (não da célula) que vai aparecer na JTable, para cada coluna. É essa classe que vai receber o List criado por aquele método lá do início…
Bom, tendo feito isso, agora nos resta ver como falar para a JTable usar todo esse troço.
Como eu disse, mesmo criando a JTable no NetBeans, você tem controle sobre ela no restante do código.
Para configurar sua JTable, toda vez que você atualizar os dados, crie na GUI um método como este:
public void setListaEventos(List<Evento> eventos){
this.eventos = eventos;
tableEventos.setModel(new TableModelEventos(eventos));
tableEventos.setSelectionModel(new DefaultListSelectionModel(){
public String toString(){
return "tableEventos";
}
});
tableEventos.getSelectionModel().addListSelectionListener(this);
tableEventos.setAutoCreateColumnsFromModel(false);
tableEventos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
FontMetrics fm = tableEventos.getFontMetrics(tableEventos.getFont());
tableEventos.setColumnModel(new ColumnModelEvento(fm));
setListaEventosImpressao(gerarEventosImpressao(eventos));
if (!eventos.isEmpty()){
setEvento(eventos.get(0));
}
else{
limparEvento();
}
}
E quando você chama esse método? Toda vez que precisar atualizar dua JTable. Basta passar para ele o List retornado por aquele método lá do início (e que muito provavelmente estará em uma classe DAO).
Vamos, novamente, por partes:
Aqui você informa que o modelo (que possui os dados) adotado por sua JTable (tableEventos) é um TableModelEventos, que recebe uma Lista com os dados a apresentar.
tableEventos.setModel(new TableModelEventos(eventos));
Aqui você diz que ele vai usar o seu modelo de colunas, e não o padrão:
tableEventos.setAutoCreateColumnsFromModel(false);
Aqui você diz que a JTable vai usar o seu ColumnModel personalizado:
tableEventos.setColumnModel(new ColumnModelEvento(fm));
Bom… dê uma digerida nisso tudo :D, e qualquer dúvida com relação ao código, poste aqui novamente, ou sinta-se à vontade para entrar em contato via e-mail, se preferir.
Se te serve de consolo, trabalhar com JTable, usando modelos, é complicado para a maioria dos programadores, e é complicado no início, mas é a melhor maneira de se ter controle total sobre a JTable. Com essa abordagem você pode, por exemplo, colocar um JComboBox em uma célula, ou um JCheckBox.
Quando comecei eu tomei como base um exemplo apresentado pelo Fernando Lozano, na Java Magazine ed. 25.
Dê uma olhada aqui também… vai te ajudar
bom… taí
boa sorte :thumbup: