Essa é para os swingueiros de plantão(swinguers é outra coisa e não sou chegado a isso não… rsrsrs):
Tive problemas há pouco tempo atrás, para montar um JTable com Sub Headers, peguei uma classe bem antiga(acho que de 97-98), e cansei até dar o tratamento que eu queria na JTable.Com para corno, todo castigo é pouco, depois que tinha tudo pronto descobri uma (feita por Steve Webb) bem melhor que a minha, que funciona beleza.(Código completo no anexo).
Fica aqui registrado para quem precisar.
Não sei como não existe algo simples para isso, só grupando as colunas automaticamente.
Nossa, interessante, baixei, agora só preciso implementar para funcionar.
higornucci
Já executei e vi o resultado. Não achava que isso era possível hahaha
Brigadão o/
Ironlynx
Nem precisa, se quiser testar, rode o GroupableColumnExample.java que vc verá funcionando.
Tem coisas que eu não entendo pq não tem algo assim na API.
Acabei de ter que fazer algo porco(e graannde) só para comparar uma célula de uma coluna com outra, e se uma for menor, pintar de uma cor, se for maior que a outra, de outra.Ter que ficar implementando um TableCellRenderer para colorir, outro para centralizar conteúdo… eu fico velho perdendo esse tempo danado.
Marky.Vasconcelos
Nossa, muito bom, e funciona com qualquer model.
Acabei de testar com o que eu fiz e sem problema algum.
Perfeito!
Ironlynx
Peraí, vc não deu só um setModel(seuTableModel) e funcionou,né? :shock:
Marky.Vasconcelos
Peraí, vc não deu só um setModel(seuTableModel) e funcionou,né? :shock:
Não não, dei uma mechida naqueles TableHeadersGroups também.
Vou melhorar meu exemplo e posto aqui depois.
Mas o barato é bom mesmo.
Ironlynx
Ah, tá… eu fiz uma pta gambiarra aqui para aceitar meu AbstractTableModel.Tá horroroso o código.
Marky.Vasconcelos
Sério?
Basicamente o que fiz.
ObjectTableModel<Person> model = new ObjectTableModel<Person>(
new AnnotationResolver(Person.class), "name,age,live");
model.add(new Person("Marky",19,true));
model.add(new Person("Doug",20,true));
model.add(new Person("Adams",17,true));
model.add(new Person("Vscs",23,true));
model.add(new Person("Pedro",70,false));
// Setup table
JTable table = new JTable();
table.setColumnModel(new GroupableTableColumnModel());
table.setTableHeader(new GroupableTableHeader(
(GroupableTableColumnModel) table.getColumnModel()));
table.setModel(model);
// Setup Column Groups
GroupableTableColumnModel cm = (GroupableTableColumnModel) table
.getColumnModel();
ColumnGroup g_name = new ColumnGroup("name");
g_name.add(cm.getColumn(1));
ColumnGroup g_token = new ColumnGroup(new GroupableTableCellRenderer(),
"live");
g_name.add(g_token);
g_token.add(cm.getColumn(2));
// Finish off gui
JScrollPane scroll = new JScrollPane(table);
getContentPane().add(scroll);
setSize(800, 200);
Mas não tenho certeza se usei todos recursos, é dificil pensar nesses groups ai.
Ironlynx
Peraí o que vc mexeu nesse TableHeader.
Se eu apenas passar o model como vc passou acima eu receberia de cara um ArrayIndexOutOfBoundsException.
Acho que vou ter que customizar esse troço, tem que ficar mais fácil passar um AbstractTableModel, se não todo mundo vai usar o default para carregar os dados nesse troço(e nossa campanha vai por água abaixo… :lol: )
Marky.Vasconcelos
Então, eu tinha tomado um ArrayIndexOutOfBoundsException também, mas é por causa de g_token.add(cm.getColumn(3));, e o model só tem 3 colunas (0, 1 e 2).
Tem que aprender configurar isso direitinho ou facilitar o modo como faz isso.
Realmente, não podemos nossa campanha ir por agua abaixo.
Ironlynx
Na verdade, eu acho que é por causa do GroupableTableColumnModel(que extende DefaultTableColumnModel).Se vc testar, ele já bomba em cm.getColumn(0) pois vc recebe um: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Vector.java:427)
(meu model de testes tem 9 colunas).Tô lendo a API aqui para ver o que é melhor substituir.
Marky.Vasconcelos
Ué, mas meu código ali em cima funcionou sem problemas.
Ironlynx
Sem mexer em nenhuma das outras classes? :shock: (nem o TableHeader, se o fez, posta a mudança aqui)???
Marky.Vasconcelos
importjava.awt.Color;importjava.awt.Component;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjavax.swing.*;importjavax.swing.table.DefaultTableCellRenderer;importjavax.swing.table.JTableHeader;importmark.utils.el.annotation.AnnotationResolver;importmark.utils.swing.table.ObjectTableModel;publicclassGroupableColumnExampleextendsJFrame{GroupableColumnExample(){super("Multi-Width Header Example");ObjectTableModel<Person>model=newObjectTableModel<Person>(newAnnotationResolver(Person.class),"name,age,live");model.add(newPerson("Marky",19,true));model.add(newPerson("Doug",20,true));model.add(newPerson("Adams",17,true));model.add(newPerson("Vscs",23,true));model.add(newPerson("Pedro",70,false));// Setup tableJTabletable=newJTable();table.setColumnModel(newGroupableTableColumnModel());table.setTableHeader(newGroupableTableHeader((GroupableTableColumnModel)table.getColumnModel()));table.setModel(model);// Setup Column GroupsGroupableTableColumnModelcm=(GroupableTableColumnModel)table.getColumnModel();ColumnGroupg_name=newColumnGroup("name");g_name.add(cm.getColumn(1));ColumnGroupg_token=newColumnGroup(newGroupableTableCellRenderer(),"live");g_name.add(g_token);g_token.add(cm.getColumn(2));// Finish off guiJScrollPanescroll=newJScrollPane(table);getContentPane().add(scroll);setSize(800,200);}publicstaticvoidmain(String[]args){GroupableColumnExampleframe=newGroupableColumnExample();frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});frame.setVisible(true);}}/** * Demo renderer just to prove they can be used. */classGroupableTableCellRendererextendsDefaultTableCellRenderer{/** * * @param table * @param value * @param selected * @param focused * @param row * @param column * @return */publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,booleanselected,booleanfocused,introw,intcolumn){JTableHeaderheader=table.getTableHeader();if(header!=null){setForeground(Color.WHITE);setBackground(Color.RED);}setHorizontalAlignment(SwingConstants.CENTER);setText(value!=null?value.toString():" ");setBorder(UIManager.getBorder("TableHeader.cellBorder"));returnthis;}}
Marky.Vasconcelos, como faço para mapear sua ObjectTableModel usando um relacionamento OneToOne?
grato
Wesley Oiveira
Marky.Vasconcelos
PS: Esse topico merecia aquela carta “O topico que renasce” kk
anyway…
O que voce quis dizer com esse relacionamento OneToOne? Se for mostrar atributos dos objetos dentro do objeto do model (exemplo: person.getAddress().getStreet()) o ObjectTableModel já suporta, desde que os dados já estejam no modelo.