| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 16:59:16
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
Pessoal, boa tarde!
Gostaria de saber se há alguma técnica para contornar o seguinte problema:
Quero estender a classe DefaultTreeModel e sobrescrever o método abaixo:
Só que gostaria de fazer algumas verificações antes de permitir que seja inserido um nó na árvore (JTree). Caso algum critério não seja cumprido, queria disparar uma exceção (que iria para os níveis superiores até chegar ao usuário), impedindo assim que o nó (nosso TreeNode) fosse adicionado à árvore.
Ou seja.. após herdar a classe, fazer isso:
Têm alguma técnica que posso usar para contornar esse problema e poder lançar a exceção para cima? Técnica para adicionar lançamento de exceções em método herdado que originalmente não tinha (mantendo a herança dele) ?
Grato
This message was edited 2 times. Last update was at 30/12/2010 15:02:13
|
"Go ahead, make my day!" |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 17:03:03
|
rmendes08
GUJ Master
![[Avatar]](/images/avatar/9ee855f3ce4dd40182183463232e2162.jpg)
Membro desde: 29/05/2008 14:09:28
Mensagens: 1617
Online
|
Sim, basta que sua exceção estenda java.lang.RuntimeException ao invés de estender java.lang.Exception diretamente. Assim o compilador não exigirá que sua exceção seja declarada na assinatura do método.
|
"A Técnica é transformada em Arte por quem a emprega"
"O futuro pertence àqueles que acreditam na beleza de seus sonhos"
Computadores Fazem Arte
http://www.uaijug.com.br
"É importante estabelecer uma estrutura de alto nível, mas isso não significa criar uma infinidade de diagramas de classes detalhados." |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 17:04:02
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
Ok, vou testar e informo se obter sucesso!
Valeu! Achava que esse problema era insolúvel ...
|
"Go ahead, make my day!" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 17:26:35
|
marcobiscaro2112
JWizard
Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline
|
Você pode lançar uma RuntimeException (que não é uma checked exception) que encapsula outra exceção. Exemplo:
This message was edited 1 time. Last update was at 28/12/2010 17:26:47
|
Marco Biscaro.
Seja livre!
Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/12/2010 17:46:36
|
peczenyj
Moderador
![[Avatar]](/images/avatar/299dc35e747eb77177d9cea10a802da2.jpg)
Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline
|
Vc precisa de uma classe que É UMA DefaultTreeModel?
Vc poderia usar composição ao inves de herança e ter uma classe X que TEM UM atributo que é uma DefaultTreeModel e vc adiciona / remove nesse cara e a sua classe se preocupa em validar de acordo com as suas regras.
Inclusive sua classe X poderia implementar a interface TreeModel para ser mais compativel com algumas coisas. Lançar RuntimeException quando vc quer validar de forma explicita se algo deu certo me parece um tanto errado.
Vejo outra opção: pense em criar a sua classe de forma imutavel e o insertBlaBlaBla retorna uma nova instancia da sua classe com estas alterações e um método isValid para verificar se o objeto é bacana ou não.
|
http://pacman.blog.br
'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.' |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/12/2010 07:52:05
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
peczenyj wrote:
Vc poderia usar composição ao inves de herança e ter uma classe X que TEM UM atributo que é uma DefaultTreeModel e vc adiciona / remove nesse cara e a sua classe se preocupa em validar de acordo com as suas regras.
Sim, poderia. Mas não poderia usar como filho do DefaultTreeModel. Teria que adaptar todas as classes para lidar com essa.
peczenyj wrote:
Inclusive sua classe X poderia implementar a interface TreeModel para ser mais compativel com algumas coisas. Lançar RuntimeException quando vc quer validar de forma explicita se algo deu certo me parece um tanto errado.
Sem dúvida. Mas como vou lidar só com String's, me parece um esforço desnecessário implementar um TreeModel personalizado só para lançar uma exceção se uma condição não for satisfeita...
Outra abordagem seria a que você apresentou acima. Que daí seria o mais "correto".
peczenyj wrote:
Vejo outra opção: pense em criar a sua classe de forma imutavel e o insertBlaBlaBla retorna uma nova instancia da sua classe com estas alterações e um método isValid para verificar se o objeto é bacana ou não.
Aí eu quebro o mecanismo de herança. Não quebro? O método é void:
Acho que uma alternativa melhor é criar uma interface com o método isValid. Daí eu checaria se o model implementa a interface e se o método isValid retorna true. Caso não retorne, eu já saberia que houve duplicação...
Resumindo: Acho o problema simples demais e insignificante para maiores preocupações. Será usado em alguns trechos do programa (3 trechos). Só é para checar se há elementos repetidos no modelo. Se houver, disparar uma exceção. A abordagem do Runtime parece interessante porque somente onde for interessante checar a duplicação e onde eu souber que estou usando o DefaultTreeModel herdado é que vou manipular essa exceção.
This message was edited 3 times. Last update was at 29/12/2010 08:02:18
|
"Go ahead, make my day!" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/12/2010 08:04:14
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
marcobiscaro2112 wrote:Você pode lançar uma RuntimeException (que não é uma checked exception) que encapsula outra exceção.
Exemplo:
Hoje de manhã vou testar e aviso. A idéia é essa mesma. Lançar "para cima" essa exceção, para ser manipulada nos métodos superiores da pilha, até chegar na interface gráfica (na classe do JFrame, que irá tratar a exceção).
This message was edited 1 time. Last update was at 29/12/2010 08:07:42
|
"Go ahead, make my day!" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/12/2010 10:00:11
|
marcobiscaro2112
JWizard
Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline
|
A propósito, se você for usar a abordagem de encapsular a exceção, crie uma classe filha de RuntimeException, que você usará no seu catch. Exemplo:
No hora de tratar a exceção, faça um catch só para a sua exceção criada.
Isso é importante pois há pelo menos umas 50 subclasses diferentes de RuntimeException só na API padrão e capturar tudo isso em um catch fica muito genérico.
|
Marco Biscaro.
Seja livre!
Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/12/2010 10:43:40
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
A abordagem está funcionando. Estou conseguindo capturar a exceção em nível superior.
A propósito, se você for usar a abordagem de encapsular a exceção, crie uma classe filha de RuntimeException
Estou fazendo isso agora. É melhor mesmo, para evitar capturar outra RuntimeException...
This message was edited 1 time. Last update was at 29/12/2010 10:44:44
|
"Go ahead, make my day!" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/12/2010 10:50:33
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Só um detalhe. De que adianta seu TreeModel lançar uma exceção, se seu JTree não está preparado para captura essa mesma exceção?
Se o método não tem esse tipo de coisa no seu contrato, de nada adianta disparar a exception.
|
@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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/12/2010 14:55:30
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
ViniGodoy wrote:Só um detalhe. De que adianta seu TreeModel lançar uma exceção, se seu JTree não está preparado para captura essa mesma exceção?
Se o método não tem esse tipo de coisa no seu contrato, de nada adianta disparar a exception.
A idéia é simples. É para capturar a exceção do TreeModel, mas não será o JTree que irá capturar.
As funções CRUD da JTree serão feitas por JButtons e JPopMenu. São nos ActionListeners dos botões e opções do JPopMenu é que vou capturar as exceções do TreeModel. Só vou usar a JTree para obter a instância do TreeModel. Esta instância será justamente uma instância da minha classe herdada da DefaultTreeModel, que encapsula a exceção dentro de uma RuntimeException.
Eu manipulo a instância do TreeModel e verifico se houve a exceção. Se tiver ocorrido, informo o usuário e desfaço as alterações no TreeModel (ou posso impedir de serem salvas).
This message was edited 1 time. Last update was at 30/12/2010 14:59:32
|
"Go ahead, make my day!" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/12/2010 14:59:09
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
Deu certo.
Minha aplicação, na interface gráfica, verifica se houve uma "ExceptionContainer" (a extensão que fiz da classe RuntimeException) e trata a exceção contida dentro dela (a que eu lanço da TreeModel, nos níveis mais inferiores, ao inserir e alterar nodos da árvore).
Essa exceção sobe as camadas, sem declarações de throws, sendo capturada só onde interessa e sem eu precisar criar um TreeModel do zero...
This message was edited 2 times. Last update was at 30/12/2010 15:00:37
|
"Go ahead, make my day!" |
|
|
 |
|
|