Olá eu desenvolvi esse padrão de manipulação de células de uma JTable. Penso que não esteja correto mas preciso da opinião de vocês.
Criei um modelo da JTable
package org.ws;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class SimpleTableModel extends AbstractTableModel {
private ArrayList linhas = null;
private String[] colunas = null;
private boolean[] colsEdicao;
public SimpleTableModel(ArrayList dados, String[] colunas) {
this.setLinhas(dados);
this.setColunas(colunas);
}
@Override
public String getColumnName(int col){
return getColunas()[col];
}
public void removeRow(int row) {
getLinhas().remove(0);
fireTableRowsDeleted(row, row);
}
public void addRow(String[] dadosLinha) {
getLinhas().add(dadosLinha);
int linha = getLinhas().size() - 1;
fireTableRowsInserted(linha, linha);
}
public int getRowCount() {
return getLinhas().size();
}
public int getColumnCount() {
return getColunas().length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
String[] linha = (String[]) getLinhas().get(rowIndex);
return linha[columnIndex];
}
@Override
public void setValueAt(Object value, int row, int col) {
String[] linha = (String[]) getLinhas().get(row);
linha[col] = (String) value;
fireTableCellUpdated(row, col);
}
/**
* @return the linhas
*/
public ArrayList getLinhas() {
return linhas;
}
/**
* @param linhas the linhas to set
*/
public void setLinhas(ArrayList linhas) {
this.linhas = linhas;
}
/**
* @return the colunas
*/
public String[] getColunas() {
return colunas;
}
/**
* @param colunas the colunas to set
*/
public void setColunas(String[] colunas) {
this.colunas = colunas;
}
}
depois eu criei minha própria classe que trata do DefaultTableCellRenderer dessa JTable ao invés de usar os seus métodos na Exibição…
package org.ws;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
public class MyDefaultTableCellRenderer {
private DefaultTableCellRenderer renderer = null;
private JTable tabela;
public MyDefaultTableCellRenderer(JTable tabela) {
renderer = new DefaultTableCellRenderer();
setTabela(tabela);
}
public void setWidthColuna(int col,int width) {
getTabela().setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
getTabela().getColumnModel().getColumn(col).setPreferredWidth(width);
}
public void alinharEsquerda(int col) {
getRenderer().setHorizontalAlignment(SwingConstants.LEFT);
getTabela().getColumnModel().getColumn(col).setCellRenderer(getRenderer());
}
public void alinharCentro(int col) {
getRenderer().setHorizontalAlignment(SwingConstants.CENTER);
getTabela().getColumnModel().getColumn(col).setCellRenderer(getRenderer());
}
public void alinharDireita(int col) {
getRenderer().setHorizontalAlignment(SwingConstants.RIGHT);
getTabela().getColumnModel().getColumn(col).setCellRenderer(getRenderer());
}
/**
* @return the renderer
*/
public DefaultTableCellRenderer getRenderer() {
return renderer;
}
/**
* @param renderer the renderer to set
*/
public void setRenderer(DefaultTableCellRenderer renderer) {
this.renderer = renderer;
}
/**
* @return the tabela
*/
public JTable getTabela() {
return tabela;
}
/**
* @param tabela the tabela to set
*/
public void setTabela(JTable tabela) {
this.tabela = tabela;
}
}
e por fim o JFrame que exibe essa JTable
private void formComponentShown(java.awt.event.ComponentEvent evt) {
ArrayList dados = new ArrayList();
String[] colunas = new String[]{"Estado", "Cidade","População"};
boolean[] edicao = {false,false};
dados.add(new String[]{"SP", "São Paulo","14.000.000.000"});
dados.add(new String[]{"BA", "Salvador","3.000.000.000"});
dados.add(new String[]{"RN", "Rio de Janeiro","9.000.000.000"});
dados.add(new String[]{"ES", "Vitória","1.000.000.000"});
SimpleTableModel modelo = new SimpleTableModel(dados, colunas);
tabela.setModel(modelo);
tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
MyDefaultTableCellRenderer celulas = new MyDefaultTableCellRenderer(tabela);
celulas.setWidthColuna(0, 50);
celulas.setWidthColuna(1, 300);
celulas.setWidthColuna(2, 200);
celulas.alinharCentro(0);
celulas.alinharCentro(2);
doLayout();
}
eu deixei tudo modularizado, tendo a mesma intenção da DefaultTableModel. Fiz o mesmo com o DefaultTableCellRenderer. É um padrão correto de desenvolvimento?