Pergunta

Eu estava esperando que alguém poderia explicar algo para mim, como eu encontrei a minha solução, mas eu não entendo por que ele funciona.Eu queria definir um padrão renderizador por tipo de Classe para uma tabela inteira, não sabendo na criação, onde os objetos serão nele.

Eu havia declarado uma JTable e definir o padrão do processador para que o meu próprio, para o Calendar classe, de modo a que qualquer Calendars daria uma representação significativa, não apenas um toString() de si mesmos.

JTable table = new JTable();
table.setDefaultRenderer(Calendar.class, new MyRenderer());

public class MyRenderer extends DefaultTableCellRenderer{
    public MyRenderer() { super(); }
    @Override
    public void setValue(Object value){
            setText(makeCalendarToDate((GregorianCalendar)value));
    }
}

Isto não funcionará até que eu anulava o método getColumnClass como foi feito Aqui

De acordo com o sol Documentação, parece que getColumnClass deve fazer exatamente o que foi substituído no exemplo que eu dei acima - por que isso funciona quando eu substituir esse método, mas não quando eu deixar o estoque de implementação?

Agora eu posso preencher a coluna com Calendars pendentes enchem a 0 linha, que é o que eu queria, mas o que me impediu de fazer isso em primeiro lugar?

Foi útil?

Solução

JTable fica a coluna de classe do modelo.A resposta encontra-se na implementação de AbstractTableModel, supondo que o que você baseou o seu modelo de tabela no.Em AbstractTableModel getColumnClass foi implementado assim: return Object.class; Então, a menos que você substituí-lo, a coluna de objetos será sempre tratada como Objeto.Isso não é algo que a modelo irá lidar automaticamente.Você só tem que substituir getColumnClass, não há nenhuma maneira de contornar isso.

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