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

    Problema con addKeyListener

    Ho un vettore non n JTextField. Da questo vettore ho avviato un ciclo while che costruisce una GUI con n JTextField ed il mio problema è che in questo modo non riesco ad usare in modo corretto l'addKeyListener. In sostanza scrivo questo:

    codice:
    ((JTextField) VJTF_scelte[j_globale - 1])
                        .addKeyListener(new KeyAdapter() {
                            public void keyPressed(KeyEvent evt) {
                                premuto_invio(evt);
                            }
    private void premuto_invio(KeyEvent evt) {
                                int campi_selezionabili = JCB_scelte.getSelectedIndex() + 1;
    if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                                    try {
    Integer a = Integer.parseInt(((JTextField) VJTF_scelte[j_globale - 1]).getText().toString());
                                     ...

    e poi mi blocco perché il valore di 'J_globale' che ottengo è sbagliato...
    In pratica il J_globale che usa il metodo premuto_invio() non è quello usato al momento della creazione della GUI ma l'ultimo a cui è arrivato il ciclo while.
    Non vi posto tutto il codice perchè è complesso.
    In pratica mi servirebbe un metodo che calcoli la posizione della JTextField all'interno del vettore VJTF_scelte.





  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    In pratica mi servirebbe un metodo che calcoli la posizione della JTextField all'interno del vettore VJTF_scelte.
    Innanzitutto ti faccio notate che se l'intenzione è quella di gestire il solo tasto 'invio' sul JTextField, allora un KeyListener non è strettamente necessario. Basta un più semplice ActionListener, perché JTextField gestisce già "di serie" l'invio di un ActionEvent ogni volta che viene premuto 'invio'.

    Come seconda cosa, non ho ben capito se a te serve il riferimento al JTextField che ha generato l'evento oppure se ti serve l'indice in quell'array da cui parti. Comunque spiego entrambi i casi.

    Se all'interno del metodo dell'evento vuoi avere il riferimento al JTextField, questo è banale: basta prendere il "source" dell'evento con getSource() dall'oggetto XyzEvent (tutti gli oggetti di evento che estendono java.util.EventObject hanno il getSource() ).

    Se ti interessa che il listener "sappia" quale è l'indice per quel JTextField, nessuno ti vieta di incapsulare l'indice nella istanza del listener, visto che hai una istanza distinta per ciascun JTextField.

    (molto abbozzato)

    codice:
    for (int i = 0; i < .....; i++) {
        final int indiceTmp = i;
    
        // ......
    
        espressionePerTextField.addXyzListener(new XyzListener() {
            private int indice = indiceTmp;
    
            public void metodoDelListener() {
                // usa indice
            }
        });
    }
    Ultima modifica di andbin; 10-01-2014 a 22:05
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto ti faccio notate che se l'intenzione è quella di gestire il solo tasto 'invio' sul JTextField, allora un KeyListener non è strettamente necessario. Basta un più semplice ActionListener, perché JTextField gestisce già "di serie" l'invio di un ActionEvent ogni volta che viene premuto 'invio'.

    Come seconda cosa, non ho ben capito se a te serve il riferimento al JTextField che ha generato l'evento oppure se ti serve l'indice in quell'array da cui parti. Comunque spiego entrambi i casi.

    Se all'interno del metodo dell'evento vuoi avere il riferimento al JTextField, questo è banale: basta prendere il "source" dell'evento con getSource() dall'oggetto XyzEvent (tutti gli oggetti di evento che estendono java.util.EventObject hanno il getSource() ).

    Se ti interessa che il listener "sappia" quale è l'indice per quel JTextField, nessuno ti vieta di incapsulare l'indice nella istanza del listener, visto che hai una istanza distinta per ciascun JTextField.

    (molto abbozzato)

    codice:
    for (int i = 0; i < .....; i++) {
        final int indiceTmp = i;
    
        // ......
    
        espressionePerTextField.addXyzListener(new XyzListener() {
            private int indice = indiceTmp;
    
            public void metodoDelListener() {
                // usa indice
            }
        });
    }
    Bravo andbin, hai capito perfettamente il mio problema. Rispondo subito alla tua domanda. A me interessa il secondo caso ovvero mi interessa che il listener "sappia" quale è l'indice per quel JTextField però non so come incapsulare l'indice nell'istanza del listener. L'indice mi serve per dire al programma: "quando nella JTextField i-esima del mio vettore l'utente scrive 'tante pippe' nella i-esima successiva scrivi 'ancora tante pippe'". Scusa per le 'pippe' il mio linguaggio purtroppo è poco informatico...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    però non so come incapsulare l'indice nell'istanza del listener.
    È quello che ho fatto nel codice abbozzato ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    È quello che ho fatto nel codice abbozzato ...
    Scusa, non avevo visto la variabile final, ora ho capito!

    Appena ho corretto come per magia tutto si è messo a funzionare, e vaiiiii!!!! questo problema e risolto!!!!!

    Sei un mago andbin!!! Mille grazie!!!!



    wawwwww... come godo!!! grazie ancora andbin!!!

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.