JTable - Cell com mais de uma informação?

4 respostas
N3kr0N

Olá pessoal! É possível colocar em cada célula de um jtable alguma coisa parecida com essa imagem que eu fiz aqui

Bem… seria uma info no topo a esquerda, uma informação central e um selectbox no botton left, ha ela ainda tem q mudar de cor, mas mudar de cor eu sei como faz
da pra fazer isso?
se sim o que eu tenho que fazer? não faço a menor ideia, com TabelCellRenderer?

4 Respostas

mvargens

Cara, meio complicado, mas só uma idéia. Essa informação não poderia ser uma imagem? Talvez usando Canvas você consiga fazer algo assim, mas não conheço nenhum componente Swing que faça isso. Espero que mais alguem ajude.

N3kr0N

na verdade… só estou precisando de uma maneira de exibir o resultado da implementação de um algoritmo greedy e um algoritmo A* (A-estrela), e dessa forma eu poderia colocar o numero da casa, o valor da f.obj, e pintar a cell de uma cor apropriada, se for inicio, fim ou uma barreira.
era só pra isso mesmo

No caso vc proporia um jtable com canvas em cada cell??
eu poderia fazer tipo um componente compX onde ele herdaria um jpanel e nesse panel eu poderia colocar o que quizesse e colocar em cada cell da minha jtable?! :roll: eu acho q eu não sei como fazer isso…

R

N3kr0n: há uma saída para o que você quer fazer, mas é um tanto trabalhosa. Experimente o seguinte:

  1. Crie uma classe para armazenar os dados do valor que você deseja exibir na célula da JTable. Daqui para a frente vou supor que o nome dessa classe é ResultadoCalculo;

  2. Crie um componente gráfico especializado para exibir o valor da classe ResultadoCalculo. Uma boa pedida para isso é criar uma classe derivada de JLabel ou JPanel, sobrescrevendo o método paintComponent();

  3. No TableModel que você está usando para prover os valores da JTable existe um método chamado getColumnClass(). Reescreva este método de modo que, quando o índice da coluna for aquele da célula onde você quer exibir o valor de ResultadoCalculo, o resultado seja a definição desta classe (ou seja, você vai retornar ResultadoCalculo.class). Há também um método chamado getValueAt() - reescreva este método de modo que, quando o índice da coluna for aquele da célula onde você quer exibir o valor de ResultadoCalculo, o resultado seja uma instância da classe ResultadoCalculo;

  4. Crie uma classe que implemente a interface TableCellRenderer - sugiro usar o nome ResultadoCalculoRenderer, e herdar da classe DefaultTableCellRenderer - e sobrescreva o método getTableCellRendererComponent() de forma a retornar uma instância do componente criado no passo 2. O objeto [value] que é passado como parâmetro a este método é do tipo ResultadoCalculo, então você pode fazer um cast neste objeto e usá-lo para atribuir valores ao componente gráfico retornado pelo método;

  5. Por fim, use o método JTable.setDefaultRenderer() para dizer à JTable que, quando tiver de exibir objetos do tipo ResultadoCalculo, use o Renderer que foi criado no passo 4. Seu código provavelmente ficará assim:

Esse não é o único jeito de resolver o problema, há uma ótima discussão sobre isso no link abaixo:

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

Boa sorte!

mvargens

Uma outra forma, seria herdar de JComponent e criar um componente que faz exatamente o que você quer, caixa com imagem. Dai bastaria setar o CellEditor com esse componente customizado. Agora para exibir os valores realmente não sei como fazer. Eu acho que você deveria tentar criar uma imagem em tempo de execução com java 2D ou algo assim. Talvez uma Api gráfica da apache ou sei lá. Eu sei que tem, mas desconheço. Infelizmente nunca precisei trabalhar com isso.

Criado 31 de agosto de 2009
Ultima resposta 1 de set. de 2009
Respostas 4
Participantes 3