Domanda

Sto lavorando a un progetto che utilizza una JTable per visualizzare, tra le altre cose, una colonna di date. Avevamo bisogno di convalida per l'input dell'utente per le date, quindi ho implementato una combinazione di mascheramento per la convalida del formato e analisi per la convalida della data effettiva. L'ho fatto usando un CellEditor personalizzato per la colonna della data.

All'interno del mio MaskedCellEditor, ho un JFormattedTextField. Ho impostato il mascheramento per le date. Quindi aggiungo un InputVerifier per consentire la convalida effettiva. Il mio InputVerifier implementa verifica () per verificare: 1. textField.isEditValid () 2. DateValidator.ValidDate (). Se uno dei due non è valido, verifica restituisce false e InputVerifier blocca lo stato attivo nel campo di testo (l'editor di celle) e viene visualizzata una piccola finestra di dialogo che ricorda all'utente il formato della data.

Il messaggio di errore è un JDialog piccolo, non decorato, non modale, non focalizzabile che si apre sotto la cella in fase di modifica. Scompare quando si preme un tasto o una verifica della data riuscita. Funziona benissimo tranne che per un piccolo case.

Se l'utente seleziona un pulsante di menu nella parte superiore dell'applicazione mentre una finestra di dialogo non valida ha visualizzato una finestra di dialogo non valida, cambia schermata, distruggendo tutto ciò che è attualmente sullo schermo (inclusa la tabella). Tuttavia, poiché viene visualizzata la finestra di dialogo e non è avvenuta una pressione del tasto / modifica riuscita, la finestra di dialogo non viene mai nascosta. Rimane visibile in un contesto completamente indipendente su uno schermo diverso. Una volta che l'utente ha spento lo schermo con la tabella, non c'è modo per l'utente di liberarsi della finestra di dialogo.

Ho discusso lanciando un Timer e / o un MouseListener nella finestra di dialogo stessa che lo farebbe scomparire, ma sento che sto ignorando il problema reale. La finestra di dialogo non viene mai eliminata e sono abbastanza sicuro perché è ancora impostato per essere visibile e impedisce al garbage collector di sbarazzarsene.

Ho un metodo Cleanup sul pannello che contiene JTable, ma non riesco a trovare un buon modo per fare riferimento alla finestra di dialogo (un componente di InputVerifier) ??per liberarmene. La finestra di dialogo è abbastanza lontana dal pannello principale della tabella. (Pannello - > JTable - > CellEditor - > JFormattedTextField - > InputVerifier - > JDialog)

Qualche idea su come forzare la finestra di dialogo da nascondere quando il tavolo viene distrutto? Se hai bisogno di maggiori dettagli, fammi sapere. Sto cercando di non impantanarti nei dettagli, ma c'è molto da fare.

È stato utile?

Soluzione

Come primo pensiero, non puoi scendere dall'approccio dell'ascoltatore. Se si dispone di un metodo di tipo closeErrorDialog () che viene chiamato in caso di valdiazione corretta, è possibile chiamarlo anche quando si seleziona un'azione di menu.

In alternativa, forse potresti controllare in qualche modo la transizione da un menu all'altro e creare una "pulizia" " metodo che chiuderà eventuali finestre di dialogo di errore esistenti. Ciò consentirebbe che qualsiasi altra azione da eseguire durante la modifica dei menu avvenga nello stesso posto.

Solo un paio di idee veloci sulla cima della mia testa. Spero che siano sulla falsariga di ciò che intendevi

Altri suggerimenti

Molte persone mi voteranno per averlo detto, ma sembra che la tua finestra di dialogo dovrebbe essere modale in modo che gli utenti non possano abbandonarla senza prima eliminarla. O almeno disabilitare i menu che consentono alle persone di spostarsi mentre viene visualizzata questa finestra di dialogo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top