Algo que eu planejava a algum tempo é oferecer um modo onde seja possivel ter colunas em uma JTable com valores agregados como, soma, média, menor, maior e etc.., foi com essa intenção que criei as AggregateFunctions. O model que faz isso para as colunas está pronto, e é o AggregateModel.
Mas encontrei alguns desafios não triviais para fazer isso funcionar, não existe nem na JTable nem no JScrollPane um modo de adicionar um footer, a unica maneira que pensei para resolver isso é criando uma classe que estende JPanel que tenha um JScrollPane com uma “Main Table” e outro com uma linha fixa com o model de agregação dos valores da tabela principal. Então para encapsular essa “gambiarra” criei a classe JTableView, com ela é possivel utilizar esse novo recurso. Mas ainda tem alguns poucos defeitos que ainda não consegui resolver (uma contribuição se alguem souber é bem vinda ^^).
Para utiliza-la, é necessario instanciar o JTableView com um modelo qualquer e depois as funções que serão utilizadas nas colunas do footer.
Como exemplo, usaremos o modelo “Person” para exibir alguns valores e aplicaremos algumas funções nas colunas.
Person.java
public class Person {
@Resolvable(colName = "Name")
private String name;
@Resolvable(colName = "Age")
private int age;
@Resolvable(colName = "Live")
private boolean live;
public Person(String name, int age, boolean live) {
this.name = name;
this.age = age;
this.live = live;
}
}
Com isso criamos o modelo e adicionamos alguns dados.
PS:Para quem não sabe como funciona o ObjectTableModel pode ver aqui.
ObjectTableModel model = new ObjectTableModel(
new AnnotationResolver(Person.class), "name,age,live");
model.setEditableDefault(true);
model.add(new Person("A", 10, true));
model.add(new Person("B", 20, true));
model.add(new Person("C", 30, false));
model.add(new Person("D", 40, true));
model.add(new Person("E", 50, true));
PS: JTableView não funciona apenas com o ObjectTableModel, mas ele é o mais simples de ser utilizado em qualquer ocasião.
Agora com o modelo pronto, só precisamos criar o JTableView e colocar as funções de agregações que queremos na tabela.
JTableView view = new JTableView(model);
//Os indices são 0 based.
view.getFooterModel().setFunction(0, new FuncConcat("-"));
view.getFooterModel().setFunction(1, new FuncSum());
PS: Para saber como funciona a API de AggregateFunctions, ver em CollectionsUtils.
Não é necessario ter uma função para todas as colunas, estas ficaram em branco.
Agora só basta colocar esse componente em algum lugar, como em um JFrame e exibi-lo.
JFrame frame = new JFrame();
frame.getContentPane().add(view);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Com isso temos o seguinte resultado.

Ao alteramos os valores na tabela principal o novo resultado é calculado no footer.
Como eu disse, este componente não está perfeito, ele tem suporte a re-alocação de colunas, caso voce esteja clicando no header da main table e arrastando a coluna para outro lugar.
Mas ela não tem suporte para resize de colunas, o resultado se esticar algumas colunas vai ser bem estranho, se alguém souber como resolver será muito interessante para o projeto.
Então ainda não indico utilizar este componente a não ser em caso que deixem a tabela fixada e sem suporte para mudar o tamanho das colunas, uma versão melhorada desse componente vai ser liberado assim que for arrumado estes erros pendentes.