Alteração da cor da célula jtable
-
03-07-2019 - |
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.
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.