Newsgroup: it.comp.java
Titolo: Questione di... focus

Dopo qualche tempo eccomi di nuovo a tediare con le mie domande.
Il problema è questo: nell'interfaccia che ho creato c'è un bottone che, 
ovviamente, fa qualche cosa. Io volevo che,
invece di doverci cliccare sopra, schiacciando il tasto "ENTER". Ho 
travato, grazie all'aiuto di pioneer, due sistemi:
il primo era quello di usare il setMnemonic() (l'ho fatto e funziona - 
si deve però tenere schiacciato anche il tasto ALT),
il secondo era quello di usare
b.registerKeyboardAction(action,Keb.registerKeyboardAction(action,KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),JButton.WHEN_IN_FOCUSED_WINDOW);
dove la "action" rappresenta il listener del mio bottone. Questa 
soluzione è quella che più si avvicina a quello che cercavo, però c'è un 
problema:
funziona solo se il bottone ha il "focus di lui". Come faccio a far in 
modo che (magari dico una grandissima scemenza) questo bottone abbia il
focus sempre attivo?
Grazie mille per la gentilezza di tutti quelli che vorranno aiutarmi.
A.

Dovrebbe bastare avere il focus nella Window

 
Come al solito sei sempre il primo ed il più gentile :)
Invece non basta perchè, come dicevo, se non l'ha sopra non fa una cippa! :(
Un'altra cosa: devo implementare, come mi avevi detto tu qualche 
messaggio fa, il metodo createDefaulModel per far si che
le JTextField da me create ricevano solamente tre cifre numeriche. Mi 
spiace ma non so farlo. Non è che mi potresti dare un aiutino anche qui?
Ancora grazie.
A.

>
requestFocus() ti può aiutare?

 
Allora...forse qualche cosa sono riuscito a fare: nella mia interfaccia 
ho 4 JTextField e 3 JComboBox.
Facendo come mi hai detto, se sono "attive di focus" le JTextField la 
pressione del tasto ENTER fa il suo mestiere. Se capita invece che il 
focus sia su una delle JComboBox allora niente. Cosa mi manca ora. Ma 
porcaccia la miseria quanto è brutto essere ignoranti! :)
A.

 requestFocus() ti puņ aiutare?
In che senso? Non riusciresti a spiegarti meglio. Sono un po' niubbo, 
abbi pazienza!
A.


Il metodo che ti ho detto, invocato sul tuo pulsante, richiede il focus...
ora.. se al tuo pulsante aggiungi un focusListener e implementi il 
metodo focusLost(...), invocato quando il pulsante perde il focus, al 
cui interno invochi il requestFocus, ottieni che il tuo pulsante ha 
sempre il focus...


Oppure...
Dai il focus alla finestra e lģ ricevi l'evento di pressione del tasto e 
sempre li invochi il click del bottone (doClick())

Trovi un esempio nella documentazione della classe.

 sempre il focus...
Se questa cosa funzionasse (non l'ho provata), come faresti a lavorare 
con gli altri elementi della finestra? tipo, un qualsiasi altro 
componente con cui l'utente volesse interagire.
Saluti
CarMas


Visto che un componente riceve gli eventi della tastiera solo quando ha 
il focus l'unico modo di fare quello che vuoi tu è questo. Oppure 
aggiungi un listener a tutti gli oggetti della tua form per richiamare 
il bottone. E' ovvio che è sbagliato il problema. Se sei su una textarea 
  il pulsante ENTER ha un diverso significato e non puoi ignorarlo per 
eseguire il tuo pulsante.
O ti accontenti dell'ALT-ENTER come è sempre stato,
O ti accontenti del fatto che non puoi gestire gli altri componenti.
Non puoi avere entrambe le cose gratis

 E' ovvio che è sbagliato il problema. 
Infatti sono d'accordo con te! Stavo solo riflettendo sulla soluzione 
proposta e sulla funzionalita' del sistema cosi' ottenuto!
Sul bottone vai e clicchi, altrimenti se vuoi una "scorciatoia" da 
tastiera usi i normali mnemonici/acceleratori con alt+qualcosa.
Saluti
CarMas

 Ma veramente non sono io a voler fare una cosa del genere ^^;
Si scusa.. non ho visto il nick e pensavo fossi l'autore del thread.

Pietro ha scritto:

Tutto quello che dite è giusto: l'unica cosa che vi posso dire è che nel 
mio caso ci sono del JTextField (4) e 3 JComboBox che servono solo per 
"inserire dei numeri. L'unico bottone che c'è deve "fare dei calcoli". 
Quindi, in teoria, si potrebbe attaccare a tutti gli oggetti della GUI.


Ok, finalmente ci sono riuscito (a gestire il tasto ENTER).
Per il momento grazie.
A.

 
So di essere un vero rompiballe!
Ho visto l'esempio che dicevi, però non riesco a capire come "fermare" 
l'input a soli 3 numeri (forse mettendo nel ciclo for dell'esempio
  " int i = 0; i < 3;" ?)
E come faccio a limitare l'input a soli numeri?
Ti ringrazio molto e... non mandarmi troppo a quel paesello... :)
A.

 
Ok. Forse, dopo qualche tentativo ci sono riuscito!
Io ho implementato il metodo che dicevi in questa maniera (vedi sotto) e 
funziona (o almeno fa quello che intendevo io ! :) )
  public void insertString(int offset, String string, AttributeSet attr)
              throws BadLocationException
              {
                  StringBuilder builder = new StringBuilder (string);
                  for (int i = builder.length() -1; i >= 0; i--)
                  {
                      int cp = builder.codePointAt(i);
                      if(!Character.isDigit(cp))
                      {
                          builder.deleteCharAt(i);
                          if (Character.isSupplementaryCodePoint(cp))
                          {
                              i--;
                              builder.deleteCharAt(i);
                          }
                      }
                  }
                  super.insertString(offset, builder.toString(), attr); 
             }
L'ultimo problema è che devo limitare l'immissione di max 3 numeri: qui 
l'idea di attaccargli un verificatore.
Ho provato a scrivere questo (che ovviamente non funziona):
class maxTre extends InputVerifier
{
     public boolean verify(JComponent component)
     {
         JFormattedTextField field = (JFormattedTextField) component;
         if (field.getText().length() < 4)
             //La riga successiva l'ho messa se non mi dava errore ! :(
             { field.isEditValid();}
             return field.isEditValid();
     }
}
C' è qualche anima pia e di buon cuore che riesce a darmi un ulteriore 
suggerimento?
A.