Formatação Colunas jTable

13 respostas
R

Pessoal, estou com alguns problemas, já li bastante mas não consegui resolver. Devo avisar que uso uma TableModel como modelo na minha jTable. Os problemas são:

1-Definir largura das colunas de uma jTable

Eu fiz:
jTableAulas.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
jTableAulas.getColumnModel().getColumn(0).setPreferredWidth(100);
jTableAulas.getColumnModel().getColumn(1).setPreferredWidth(815);
Ela inicializa com o tamanho certinho das colunas, porém tenho um botão que seta um novo modelo na jTable (por questões de regra de negócios) e quando clico nele ela perde a largura das colunas.

O que eu queria na verdade é que uma das colunas eu determinasse a largura e a outra se ajustasse conforme o espaço que sobrar.

2-Formatar o alinhamento do conteúdo das colunas.

Eu fiz esta classe para testar:
public class FormatacaoTable extends DefaultTableCellRenderer implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Class c = table.getColumnClass(column);
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if (Integer.class.isAssignableFrom(c)) {
            comp.setBackground(Color.red);
        } else if (String.class.isAssignableFrom(c)) {
            comp.setBackground(Color.blue);
        } else if (Float.class.isAssignableFrom(c)) {
            comp.setBackground(Color.yellow);
        } else {
            comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        }
        return this;
   }
}
Só ocorre alterações nas colunas do tipo String, nas outras não ocorre nada. Fiz isso pra depois poder definir o alinhamento dependendo de qual conteúdo for, por exemplo se for String vou alinhar à esquerda, se for Integer centralizar, etc. Mas não sei como fazer isso tb.

Minha model tem o método de retorno do tipo de classe de cada coluna.

3-Como faço para validar campos, ou seja, quando for int não aceitar letras e tal?

Agradeço a ajuda pessoal e fico no aguardo.

13 Respostas

R

Pessoal, os itens 1 e 2 do post anterior eu ja resolvi.

Tentei resolver o item sobre validação dos campos mas ainda não consegui.

Queria saber como faço para por exemplo só deixar o usuário digitar números em certas colunas. Tenho colunas que são de valores inteiros e outras de valores float.

Agradeço a ajuda e fico no aguardo.

M

Posta aew como vc resolveu! Estou com um problema parecido

:wink:

R

Cara, qual é o problema que vc está tendo, explica melhor aí pra saber exatamente como te ajudar. Fiz algumas coisas então melhor tu especificar o que tentou ou quer fazer.

Fico no espera.

V

Como está implementado o método getColumnClass do seu TableModel? É ele que diz para a tabela que tipo de dado a coluna tem. A partir disso o JTable irá escolher o editor correto para a coluna.

R

Cara, como disse no post anterior, os dois problemas iniciais (largura e alinhamento de conteúdo) eu consegui resolver.

O que estou precisando, pois ainda não consegui resolver é o lance de validação de campo.

Queria que o usuário só pudesse digitar números am algumas colunas, apenas isso. Li muita coisa principalmente aqui no fórum, testei muitos exemplo mas nenhum funcionou.

Se puder me ajudar com este detalhe agradeço.

Abraço

V

Qual é o problema com a edição? Geralmente é só colocar tudo dentro de um try…catch, como te mostrei no outro post.

R

Cara, desculpa mas não entendi o que me perguntou sobre edição, pois o que não consegui fazer é a validação dos campos em tempo de edição, ou seja, não deixar o usuário digitar uma letra no campo de número, em outras palavras, bloquear a inserção de letras e deixar apenas que números sejam digitados. Imagino que tenha haver com algo relacionado ao cellEditor ou coisa assim, mas não consegui fazer funcionar.

Grande abraço e fico no aguardo.

V

Isso. Exatamente. Para impedir isso você deve associar um CellEditor ao seu JTable. Pode ser um JFormattedTextField, ou mesmo um JTextField com um Document personalizado.

1. Primeiro, crie um CellEditor com o seu componente de edição preferido:
//Um editor baseado no FormattedTextField.
public class FormattedCellEditor extends AbstractCellEditor implements TableCellEditor
{
   private JFormattedTextField tf;

   //Construtores úteis
   public FormattedCellEditor(Format format) {
      tf = new JFormattedTextField(format);
   }

   public FormattedCellEditor(JFormattedTextField.AbstractFormatter formatter) {
      tf = new JFormattedTextField(formatter);
   }

   public FormattedCellEditor(JFormattedTextField.AbstractFormatterFactory factory) {
      tf = new JFormattedTextField(factory);
   }

   //Esse método é chamado pelo JTable. Ele te diz que linha, coluna e valor o usuário está tentando editar. 
   //E você retorna ao JTable o editor, com o valor em questão já preenchido.
   public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int vColIndex) { 
      tf.setValue(value);
      return tf;
   }      

   // Esse método é chamado quando a edição termina. 
   // Ele deve retornar o novo valor que será gravado na célula.
   public Object getCellEditorValue() { 
      return tf.getValue();
   } 
}

2. Depois, você define ele como padrão para os tipos de dados que quiser:

seuTable.setDefaultEditor(Double.class, new FormattedCellEditor(createFormatter("####,##"));
seuTable.setDefaultEditor(Integer.class, new FormattedCellEditor(createFormatter("####"));
Esse código usa o seguinte método auxiliar:
protected MaskFormatter createFormatter(String s) {
    MaskFormatter formatter = null;
    try {
        formatter = new MaskFormatter(s);
    } catch (java.text.ParseException exc) {
        System.err.println("formatter is bad: " + exc.getMessage());
        System.exit(-1);
    }
    return formatter;
}

3. Finalmente, você faz o TableModel retornar Integer para as colunas inteira e Double para a as Double. E ele usará o formatador associado àquele tipo de dado.

R

Cara, fiz tudo como vc sugeriu e exatamente como mostrou explicou. Pra testar setei para uma coluna que é do tipo integer (alterei na tableModel pra retornar Integer.class) o que aconteceu é que a coluna fica travada, ou seja, não deixa eu digitar nenhum valor tanto numa célula em branco quanto em uma preenchida e tb não deixa apagar os valores de uma preenchida.

V

O método isCellEditable está retornando true para a célula que você está tentando editar?

R

Sim, o método retorna true pra todas celulas.

public boolean isCellEditable(int row, int column) { //Indicamos se a célula da row e da column é editável.Nossa tabela toda é. return true; }

V

Vou ver se monto um exemplo pra vc funcionando.

R

Ok, obrigado.

Criado 27 de outubro de 2010
Ultima resposta 29 de out. de 2010
Respostas 13
Participantes 3