Pq você não cria uma classe que extenda algum tipo de TableColumnModel (DefaultTableColumnModel)?
Dessa forma, você mesmo pode manipular informações da tabela.
Particularmente eu prefiro assim.
Exemplo:
Eu cria uma tabela no meu Form e chamo de tableCarro, somente isso, não defino o modelo dela ainda
Aí crio minha classe para manipular as colunas.
import java.awt.FontMetrics;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;
/**
*
* @author AJFILHO
*/
public class ColumnModelDeclaracao extends DefaultTableColumnModel{
public ColumnModelDeclaracao(){
}
public ColumnModelDeclaracao(FontMetrics fm, String texto){
if(texto.equalsIgnoreCase("carro")){
int letra = fm.stringWidth("M");
addColumn(criaColuna(0, 80 * letra, fm, true, "Placa"));
addColumn(criaColuna(1, 150 * letra, fm, true, "Modelo"));
addColumn(criaColuna(2, 90 * letra, fm, true, "Fabricante"));
addColumn(criaColuna(3, 200 * letra, fm, true, "Ano"));
}
}
private TableColumn criaColuna(int columnIndex, int largura, FontMetrics fm, boolean resizable, String titulo){
int larguraTitulo = fm.stringWidth(titulo + " ");
if (largura < larguraTitulo){
largura = larguraTitulo;
}
CellRenderer c = new CellRenderer();
TableColumn col = new TableColumn(columnIndex);
col.setCellRenderer(c);
col.setHeaderRenderer(null);
col.setHeaderValue(titulo);
col.setPreferredWidth(largura);
if(!resizable){
col.setMaxWidth(largura);
col.setMinWidth(largura);
}
col.setResizable(resizable);
return col;
}
}
Depois cria minha classe para renderizar a célula:
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
/**
*
* @author AJFILHO
*/
public class CellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
public CellRenderer() {
super();
}
@Override
public void setHorizontalAlignment(int alignment) {
super.setHorizontalAlignment(alignment);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
Component renderer = super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
((JLabel) renderer).setOpaque(true);
Color foreground, background;
if (isSelected) {
foreground = Color.white;
background = Color.blue;
} else {
if (row % 2 == 0) {
foreground = Color.black;
background = Color.white;
} else {
foreground = Color.white;
background = Color.darkGray;
}
}
renderer.setForeground(foreground);
renderer.setBackground(background);
return renderer;
}
@Override
public void validate() {
}
@Override
public void revalidate() {
}
@Override
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
}
@Override
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
}
Depois disso feito, volto para o meu form e crio o método para montar a tabela
public void montarTabela(JTable t) {
DefaultTableModelImpl modelo = new DefaultTableModelImpl();
t.setModel(modelo);
t.setAutoCreateColumnsFromModel(false);
t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fm = t.getFontMetrics(t.getFont());
ColumnModelDeclaracao columnModel = new ColumnModelDeclaracao(fm, "carro");
t.setColumnModel(columnModel);
CellRenderer cc = new CellRenderer();
cc.setHorizontalAlignment(SwingConstants.RIGHT);
t.getColumnModel().getColumn(0).setCellRenderer(cc);
t.getColumnModel().getColumn(3).setCellRenderer(cc);
}
Essa classe DefaultTableModelImpl é interna e a uso dentro do form mesmo
private static class DefaultTableModelImpl extends DefaultTableModel {
public DefaultTableModelImpl(Object[][] data, Object[] columnNames) {
super(data, columnNames);
}
public DefaultTableModelImpl() {
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
}
Depois de ter criado o método para montar a tabela, chamo ele dentro do meu construtor
public ConsultarCarro() {
initComponents(); //Aquele Método que o Netbeans é responsável para agrupar botões, panels, entre outros
montarTabela
}
Isso é somente para criar a tabela, porém os valores das células das colunas 0 e 3 virão centralizados, quando ocorrer uma busca e essa busca for atribuida a uma jTable.
Tomara que ajude agora! :lol:
Abraços!