Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [JAVA] Problema Focus con passaggio controllato

    Ciao, ho dato un'occhiata in giro, ma i dubbi/riposte attribuite alla gestione dei focus
    non risolvono il mio problema.
    Sto facendo un gestionale e in particolare ho creato una maschera, tramite swing, in cui l'utente
    potrà inserire l'articolo, tramite input controllati.
    Per limitare caratteri, caratteri solo numerici, numeri con 2 decimali, sintassi date,...ecc ho utilizzato
    dei plains documente fatti da me che affibiati alle varie Jtextfield del pannello fanno si che l'utente
    non inserisca cose sbagliate.
    Il problema si verifica nel caso in cui devo verificare una data.

    Ostruzioni
    - la data deve esser verificata quando premo il tasto Tab per passare da quella Jtextfiel al componente dopo
    - se quando faccio il passaggio la data non è completa oppure non esiste (tipo 29/02/2003), resetto
    il contenuto di quella Jtextfield a stringa vuota "" e ci rimetto il focus
    - il secondo passo non va fatto se l'utente si sposta con il mouse, ma solo tramite il tasto tab

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    non ti invidio proprio!!!
    Scherzi a parte, quanto ne sai di swing?
    sentito mai parlare di JXDatePicker?

    non ti risolve il problema in todo, ma da ottimi hint per la gestione delle date.

  3. #3
    Hehe diciamo che parli con un fine corso di programmazione universitaria
    su java che si sta facendo le ossa :P

    Datepicker? ma posso fare in modo che si verifichi la seguente situazione?

    Componenti:

    JTextfield1: textfield con impostato document per filtraggio sintatticodate.
    JTextfield2

    L'utente è in JTextfield1, ci scrive qualcosa che viene mano mano filtrato, per creare la data
    quando si sposta tramite il tab, la data viene controllata e se è una data esistente si sposta alla
    JTextfield2, altrimenti resetta la JTextField1 e ci posiziona il focus.

    Il controllo di validità data lo ho già fatto in un'altra classe data che uso per gli articoli,
    Quello che mi serve è gestire il focus tramite tab.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ora è un po che non uso datepicker, ma ci ho lavorato su parecchio.
    Il vantaggio che te ne deriva dall'uso di questo componente potrebbe essere la possibilità di visualizzare un calendario da cui scegliere la data e comunque lavorare solo con date. Dai un'occhiata all'api

    http://swinglabs.java.sun.com/hudson...atePicker.html


    Altrimenti dovresti settarti un keylistener e al release fare

    1. controllare che hai premuto tab, se si
    1.a controlla validità data inserita fino a quel punto
    1.b passaggio al sistema di auto completamento
    2. se no cancellare e/o forzare la riscrittura

    ma diciamo che diventa "oneroso" perchè devi controllare tutti i tasti premuti ed eventualmente tornare ad uno stato logico e considera che questi controlli li fai ogni volta che hai premuto il tasto. per questo l'uso di un componente che gestisce solo date mi sembra adatto.

    se vuoi cancellare appena ricevuto il focus, dovrebbe bastarti un focus listener con focus gained in cui fai una banale set text

  5. #5
    Originariamente inviato da valia
    ora è un po che non uso datepicker, ma ci ho lavorato su parecchio.
    Il vantaggio che te ne deriva dall'uso di questo componente potrebbe essere la possibilità di visualizzare un calendario da cui scegliere la data e comunque lavorare solo con date. Dai un'occhiata all'api
    Come soluzione offre moltissime possibilità questa e mi hai già fatto venire l'idea per una cosetta
    che devo metter come altra opzione al programma.

    Altrimenti dovresti settarti un keylistener e al release fare

    1. controllare che hai premuto tab, se si
    1.a controlla validità data inserita fino a quel punto
    1.b passaggio al sistema di auto completamento
    2. se no cancellare e/o forzare la riscrittura

    ma diciamo che diventa "oneroso" perchè devi controllare tutti i tasti premuti ed eventualmente tornare ad uno stato logico e considera che questi controlli li fai ogni volta che hai premuto il tasto. per questo l'uso di un componente che gestisce solo date mi sembra adatto.

    se vuoi cancellare appena ricevuto il focus, dovrebbe bastarti un focus listener con focus gained in cui fai una banale set text
    Purtroppo devo limitarmi proprio all'utilizzo della Jtextfield1 filtrata che ti dicevo.
    Ma il keylistener fa i controlli anche quando la Textfield o il componente interessato non ha focus?
    Perchè alla fine su 3 date in 40 components della maschera, sarebbero solamente nel peggiore dei casi
    27 controlli per tutte e tre.. Cosa che secondo me diventa irrisoria..

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    se metti il controllo su keylistener significa che ogni volta che tu premi e lasci un tasto fa tutto quel giro, irrisorio non è quando puoi fare in altri modi. Ma visto che è l'unica possibile a me viene in mente questa soluzione :-)
    guarda keylistener (in particolare usa keyadapter dove dovresti implementare keyreleased se non ricordo male)

  7. #7
    eh allora provo a dare un'occhiatina ora
    vediamo se il keylistener funzia perchè secondo me non lo riesce a percepire l'ascoltatore..
    ma ora riprovo..
    ti ringrazio per l'aiuto datomi

  8. #8
    Puoi risolvere con i Key Bindings ovvero associando un'azione particolare ad un determinato tasto (nel tuo caso il tasto TAB). Affinchè tutto funzioni però, devi escludere dal "focus traversal" il tuo componente altrimenti il sottosistema di gestione del focus "parte prima" della tua azione che quindi non verrà eseguita. Nella tua azione fai i tuoi controlli del caso e poi dovrai settare manualmente il focus sul successivo componente.

    Codice PHP:
    //Escludo il componente dalla gestione del focus
    tuoTextField.setFocusTraversalKeysEnabled(false);

    //Associo al tasto TAB l'action 'myTabAction'
    tuoTextField.getInputMap().put(KeyStroke.getKeyStroke((char)KeyEvent.VK_TAB), "myTabAction");
    tuoTextField.getActionMap().put("myTabAction", new AbstractAction("myTabAction") {
                        public 
    void actionPerformed(ActionEvent e) {
                             
    //Fai i tuoi controlli
                             
    ....
                             
    //Setta il focus sul successivo componente
                             
    if(controlloOk){
                                  
    componenteSuccessivo.requestFocus();
                             }
                        }
    }); 

    Dai uno sguardo qui soprattutto all'inizio dove spiega, perchè in questo caso, è meglio utilizzare Key Bindings anzichè Key listeners

    Al mio segnale... scatenate l'inferno!

  9. #9
    Originariamente inviato da R@ve M@ster
    Puoi risolvere con i Key Bindings ovvero associando un'azione particolare ad un determinato tasto (nel tuo caso il tasto TAB)
    .......
    Dai uno sguardo qui soprattutto all'inizio dove spiega, perchè in questo caso, è meglio utilizzare Key Bindings anzichè Key listeners

    Grazie anche a te per l'aiuto, devo dire che un pezzo di codice aiuta sempre a capire meglio il funzionamento di classi/metodi/... che non si conoscono o di cui si ignora l'esistenza
    Io per risolvere oggi ho provato un'altra strada.

    Ho istanziato:
    - un booleano che mi dice se posso trasferire o no il focus alla componente successiva.
    - una JTextfield di appoggio che viene utilizzata come appoggio se quella che ho compilato e provato a superare non soddisfa i miei requisiti
    - poi ho implementato un focus listener che fa i controlli, se il campo è abilitato per date, quando perde il focus e che quando guadagna il focus qualche elemento fa i controlli su booleano e in base a quello tramite FocusManager risetta il focus alla next della componente salvata prima di quella con il testo errato.

    Mi rendo conto che la mia soluzione è molto artificiosa ma funzionante
    Anzì ora la mia mascherina articoli è completa! manca solo inserire i dati nel db
    e caricarli da db..
    Grazie

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da R@ve M@ster
    Puoi risolvere con i Key Bindings ovvero associando un'azione particolare ad un determinato tasto (nel tuo caso il tasto TAB). Affinchè tutto funzioni però, devi escludere dal "focus traversal" il tuo componente altrimenti il sottosistema di gestione del focus "parte prima" della tua azione che quindi non verrà eseguita. Nella tua azione fai i tuoi controlli del caso e poi dovrai settare manualmente il focus sul successivo componente.
    grazie, non mi ricordavo del keybinding :-P e in effetti il codice che avevo visto e usato si riferiva al keybinding (abbiate pazienza, non guardo quel codice da un po).
    potrei aggiungere che il focus traversal non è detto che deve disabilitarlo, diciamo che deve specificare le regole in modo da fare prima il binding e poi il traversal (e il componente non è standard, ma derivato da quello standard con aggiunta delle funzionalità)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.