Pergunta

Eu estou trabalhando em um projeto que está usando um JTable para exibir, entre outras coisas, uma coluna de datas. Precisávamos de validação para a entrada do usuário para datas, então eu ter implementado uma combinação de mascarar para validação de formato e de análise para validação data real. Eu fiz isso usando um cellEditor personalizado para a coluna de data.

Dentro do meu MaskedCellEditor, eu tenho um JFormattedTextField. configuro o mascaramento para as datas. Então eu adicionar um InputVerifier para permitir a validação real. Meus implementos InputVerifier verificar () para verificar: 1. textField.isEditValid () 2. DateValidator.ValidDate (). Se qualquer um é inválido, verifique retorna falso eo InputVerifier trava o foco no campo de texto (o editor celular) e um diálogo de mensagem pequena é exibida lembrando o usuário do formato de data.

A mensagem de erro é um pequeno, undecorated, non-modal, não focusable JDialog que aparece por baixo da célula a ser editado. Ele desaparece em um keypress ou uma verificação data bem sucedida. Ele está trabalhando muito com exceção de um caso extremo de pequeno porte.

Se o usuário seleciona um botão de menu na parte superior do aplicativo, enquanto uma edição inválida estalou acima de diálogo, ele alterna telas, destruindo tudo atualmente na tela (incluindo a tabela). No entanto, uma vez que está sendo mostrado o diálogo e uma tecla / editar sucesso não ocorreu, o diálogo nunca é escondido. Ele permanece visível em um contexto completamente independentes em uma tela diferente. Uma vez que o usuário tenha desligado a tela com a mesa, não há nenhuma maneira para que o usuário se livrar do diálogo.

I têm debatido jogando ou um temporizador e / ou um MouseListener no próprio diálogo que faria com que ele desapareça, mas eu sinto que eu estou ignorando o problema real. O diálogo não está sendo descartado e eu tenho certeza que é porque ele ainda está definido para ser visível e isso está impedindo que o coletor de lixo de se livrar dela.

Eu tenho um método de limpeza no painel segurando o JTable, mas eu não posso encontrar uma boa maneira para fazer referência ao diálogo (um componente do InputVerifier), a fim de se livrar dele. O diálogo é muito distante do painel pai da tabela. (Painel -> JTable -> cellEditor -> JFormattedTextField -> InputVerifier -> JDialog)

Algumas ideias sobre como forçar o diálogo para ser escondido quando a tabela é destruído? Se você precisar de mais detalhes, deixe-me saber. Eu estou tentando não ficar vocês atolados nos detalhes, mas há muita coisa acontecendo.

Foi útil?

Solução

Como primeiro pensamento, você não pode ir para baixo a abordagem ouvinte. Se você tem um método tipo closeErrorDialog () que é chamada quando em cima valdiation bem sucedido, então você também pode chamá-lo quando uma ação de menu é selecionado.

Como alternativa, talvez você possa controlar a transição a partir do menu ao menu de alguma forma, e criar um método de "limpeza", que irá fechar os diálogos de erro exisiting. Isso permitiria que por quaisquer outras ações que precisam ocorrer ao alterar menus, a acontecer no mesmo lugar.

Apenas um par de idéias rápidas do topo da minha cabeça. Espero que eles estão ao longo das linhas do que você quis dizer

Outras dicas

Muitas pessoas vão votar-me para baixo por dizer isso, mas parece que o diálogo deve ser modal para que os usuários não é possível mudar para longe dele, sem descartá-la em primeiro lugar. Ou pelo menos desativar os menus que permitem que as pessoas a mudar de distância, enquanto este diálogo é exibida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top