Como inserir JCheckBox em apenas algumas linhas do JTable?  XML
Índice dos Fóruns » Interface Gráfica
Autor Mensagem
Schuenemann
GUJ Ranger

Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline

Pessoal, já li alguns tutoriais e posts aqui do fórum, mas ainda não consegui desenhar checkboxes nas linhas pares da primeira coluna da tabela. As malditas aparecem em todas as linhas.
Meu model:


Coloquei o Boolean apenas nas linhas pares (os outros dados já foram inseridos):


Obrigado.
fabim
GUJ Master
[Avatar]

Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline

ja tentou um parênteses?


ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται

Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao


[MSN]
rdantas
Java Ninja
[Avatar]

Membro desde: 12/02/2005 01:32:20
Mensagens: 263
Localização: Formiga-MG
Offline

e que objetos vc está passando para linhas ímpares? Tente passar Strings vazias como teste, se der certo depois vc vê o que fazer.



qq coisa posta aí.

Desenvolvedor Java
Java em Pó - Blog para assuntos Java
"Só Deus salva, os mortais fazem backup!!!"
[MSN] [ICQ]
Schuenemann
GUJ Ranger

Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline

fabiocsi wrote:ja tentou um parênteses?

Não influencia... além do mais, essa linha só define se é editável ou não

rdantas wrote:e que objetos vc está passando para linhas ímpares? Tente passar Strings vazias como teste, se der certo depois vc vê o que fazer.

Nenhum, estou deixando o default (null). Com String, lança ClassCastException.
fabim
GUJ Master
[Avatar]

Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline

Schuenemann wrote:
fabiocsi wrote:ja tentou um parênteses?

Não influencia... além do mais, essa linha só define se é editável ou não


Verdade viajei legal. Mas, pra fazer aparecer checkBox na table nao tem q mexer com CellRenderer nao? nao vi nada disso no codigo.

ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται

Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao


[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

O que você quer que apareça nas linhas ímpares?

Acho que você terá que fazer o seu próprio CustomCellEditor e CustomCellRenderer. E daí xunxar um pouquinho as coisas.

1. Faça um CustomCellRenderer que:
1.1. Teste o tipo do objeto sendo editado.
1.2. Se for um Boolean, usa o CellRenderer de Boolean.
1.3. Caso contrário, usa o DefaultCellRenderer;
2. Faça o mesmo para o CellEditor;

3. Altere o CellEditor e o CellRenderer da coluna um para os criados acima;

5. Faça o seu TableModel retornar um Boolean para as colunas com CheckBox e uma string vazia para as sem. Também faça ele retornar que as linhas sem o checkbox não são editáveis.

Tudo isso soa mais difícil do que parece.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Schuenemann
GUJ Ranger

Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline

Nas linhas ímpares não deve aparecer nada. Lembrando que isso é apenas para a primeira coluna, nas demais aparecerão String, Long, Double, etc.

Do 1 ao 3 vou ter que olhar essas classes que não conheço.

5. Faça o seu TableModel retornar um Boolean para as colunas com CheckBox e uma string vazia para as sem. Também faça ele retornar que as linhas sem o checkbox não são editáveis.

Como fazer isso? Assim, não vai.

Retornar null continua desenhando as checkbox. O não-editável nas ímpares já está funcionando.


Obrigado.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

Vai continuar dando ClassCastException enquanto você não alterar o Renderer e o Editor. Eles é que tentam fazer cast do valor das colunas Boolean para o tipo Boolean. Quando você fizer o seu próprio Renderer, você só vai delegar para o Renderer de boolean default se o tipo do valor for efetivamente boolean. Caso contrário, você vai delegar para o DefaultRenderer, que trata strings. O mesmo pro editor.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Schuenemann
GUJ Ranger

Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline

É isso? Como delegar para o Renderer de boolean default?
Outra coisa: eu adiciono ele e o CellEditor apenas na primeira coluna ou como default da tabela?
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

Se for Boolean, você retorna uma instância de


Que vai te retornar um objeto dessa classe aqui:

This message was edited 2 times. Last update was at 22/01/2008 16:23:51


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

O seu código está certo.

Adicione o renderer só para a coluna. Pensando um pouco, é provável que você nem tenha que fazer a mesma coisa para o CellEditor.
Basta definir o CellEditor de Boolean para a coluna também. Afinal, as colunas sem Booleans dentro não são editáveis. E o CellEditor só entra em ação quando o usuário consegue editar a célula.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Schuenemann
GUJ Ranger

Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline

Nem tanto... quando não era Boolean e estava na coluna zero, ele chamava o próprio Renderer recursivamente até estourar a pilha
Usando o Renderer default de String (aparentemente) deu certo.

Alguns pontos:
1- Não defini CellEditor.
2- Acho meio tosco um clique em qualquer local da célula ativar o checkbox. Tem algum jeito simples de resolver isso ou vou precisar escutar eventos de mouse? Em caso contrário, posso deixar a coluna estreita para isso não ficar muito perceptível.
3- Para definir ações dos checkboxes, é preciso implementar TableModelListener?

É, sou meio leigo em Swing

Obrigado de novo.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

Schuenemann wrote:1- Não defini CellEditor.

Beleza.

Schuenemann wrote:2- Acho meio tosco um clique em qualquer local da célula ativar o checkbox. Tem algum jeito simples de resolver isso ou vou precisar escutar eventos de mouse? Em caso contrário, posso deixar a coluna estreita para isso não ficar muito perceptível.


Bem, esse é o comportamento padrão da maior parte das tabelas com checks.
Não tem um jeito simples de fazer isso, e checar eventos do mouse não é uma boa também. Você pode deixar a coluna mais estreita usando o método setWidth do TableColumn (a JTable, q eu me lembre, tem um método para retornar o TableColumn. Na pior das hipóteses, consulte o TableColumnModel dela).

Via de regra, não é uma boa prática alterar o comportamento padrão dos componentes do Swing, a menos que existem ganchos especificamente para isso. Além de complicado, é sujeito a erros, difícil de manter e ainda não respeita os vários look&feels (e se for respeitar, vai ser mais difícil ainda).

Schuenemann wrote:3- Para definir ações dos checkboxes, é preciso implementar TableModelListener?


Que tipo de ações? Se forem ações que atuem sobre os próprios dados do model, não, você pode fazer isso no model, desde que propague o evento TableRowChanged na linha em questão. Caso contrário, sim, implemente o listener. Uma outra alternativa é implementar um dos listeners da própria JTable.


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Schuenemann
GUJ Ranger

Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline

Viajei.
Não preciso de ação alguma. Na verdade, só preciso posteriormente saber quais são as linhas checadas.


O único problema que restou é que eu gostaria que algumas células em colunas Double ficassem vazias. Antes, bastava eu setar a célula null, mas, desde que implementei meu próprio TableModel, isso lança um NullPointerException.

This message was edited 1 time. Last update was at 15/02/2008 13:10:56

Schuenemann
GUJ Ranger

Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline

Bom, voltei a mexer na classe e encontrei o erro. O getColumnClass() retornava null no caso de null. Resolvi retornar String.
Como ficou:


Obrigado pelas respostas.
 
Índice dos Fóruns » Interface Gráfica
Ir para:   
Powered by JForum 2.1.8 © JForum Team