Pergunta

Isso está me deixando absolutamente insano.

Eu sei que, para alterar a formatação das células da tabela com JTable, tenho que usar meu próprio renderizador. Mas não consigo implementar isso corretamente.

Esta é a minha configuração atual:

public class MyClass
{
    public static void main(String args[])
    {
        JTable myTable = new JTable(10, 10);
        myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer());
    }
}

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Formatting
        return c;
    }
}

O que eu preciso usar para o primeiro parâmetro de setDefaultRenderer? A API apenas diz 'classe'. Eu não tenho ideia do que colocar lá.

Alguém poderia explicar, nos termos mais simples, como eu implemento isso? Por favor, forneça um exemplo de como posso alterar a formatação de dentro do main() método também.

Foi útil?

Solução

No primeiro parâmetro para setDefaultRenderer, coloque o classe literal Para a aula que você deseja substituir a renderização. Ou seja, se seus dados consistirem em todas as cordas, você pode colocar

myTable.setDefaultRenderer(String.class, new CustomRenderer());

Se seus dados também consistirem em valores com BigDecimal ou Integer Como aulas, você deve invocar esse método várias vezes para cada tipo de classe (BigDecimal.class ou Integer.class em cada caso).

E, finalmente, para alterar a cor de fundo, você faz isso em seu renderizador:

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(new java.awt.Color(255, 72, 72));
        return c;
    }
}

Se você escrever um renderizador que deve funcionar para Todas as classes de uma interface, você também precisará modificar o getColumnClass função do seu Modelo de tabela e deixe retornar a classe de interface para todos os objetos que implementam esta interface:

public Class<? extends Object> getColumnClass(int c) {
    Object object = getValueAt(0, c);
    if(object == null) {
        return Object.class;
    if(getValueAt(0, c) instanceof IColorable) {
        return ICarPart.class;
    } else {
        return getValueAt(0, c).getClass();
    }
}

Com isso, pode -se registrar um renderizador para icolorable.class e não precisa registrar um renderizador separado para cada implementação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top