Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Acquisire Stringa numerica da Lettore codice a barre

    Salve, sto realizzando un programma che si interfaccia con un lettore di barcode. Attualmente ho messo una casella di testo JTextField e ho il focus su quella casella, il lettore (usb) alla lettura del codice mi scrive in quella casella la stringa numerica corrispondente e simula la pressione del tasto invio (come fosse una normale tastiera), quindi ho associato come actionPerformed della JTextField un metodo che mi interroga un db mysql passando come parametro di ricerca quel valore letto e funge tutto ok.
    Ora quello che vorrei realizzare è togliere quella casella di testo e far si che alla lettura del codice a barre questo venga direttamente scritto in una variabile (non so stavo pensando a qualke metodo tipo System.in che dovrebbe restituirmi il valore dello standard input) e dopodichè la variabile venga automaticamente passata al metodo che farà la query.
    Questo per un motivo fondamentale, se ovviamente non ho il focus (diciamo il cursore) posizionato su quella casella (magari perchè dopo la precedente lettura di un codice ho fatta qualche altra operazione sullo stesso JInternalFrame portando il focus su un altro componente) mi tocca costringere l'utente a riposizionare il cursore su tale casella di testo per effettuare una nuova lettura. Quello che vorrei quindi realizzare è che fin quando è mostrato il JInternalFrame che mi offre la funzionalità di lettura del codice a barra, tutte le volte ke acquisisco con lo scanner di barcode un codice, questo automaticamente venga scritto dentro una variabile.
    Avete qualche idea in merito?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Acquisire Stringa numerica da Lettore codice a barre

    Originariamente inviato da fabiolinux85
    Questo per un motivo fondamentale, se ovviamente non ho il focus (diciamo il cursore) posizionato su quella casella (magari perchè dopo la precedente lettura di un codice ho fatta qualche altra operazione sullo stesso JInternalFrame portando il focus su un altro componente) mi tocca costringere l'utente a riposizionare il cursore su tale casella di testo per effettuare una nuova lettura. Quello che vorrei quindi realizzare è che fin quando è mostrato il JInternalFrame che mi offre la funzionalità di lettura del codice a barra, tutte le volte ke acquisisco con lo scanner di barcode un codice, questo automaticamente venga scritto dentro una variabile.
    Avete qualche idea in merito?
    Una cosa che si può fare è questa: finché quel JInternalFrame è "attivo", puoi fare in modo che se viene premuto un certo tasto particolare es. F10 (e questo indipendentemente dal componente interno al JInternalFrame che ha il "focus"), venga dato il focus a quella casella di testo che deve ricevere il codice.

    Altre possibilità ci sarebbero ma bisognerebbe sapere meglio quali sono gli altri componenti in quel JInternalFrame.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    ah

    Si effettivamente premendo mettendo un comando rapido alla pressione di un tasto era la soluzione + lampante però vorrei evitare che l'utente sia costretto a questa pratica ogni qualvolta. Praticamente nel JInternalFrame ho 5 bottoni che vanno a mostrare altri 5 diversi JInternalFrame alla loro pressione. Praticamente io leggo un codice a barra di un articolo con lo scanner, se esiste nel db mi viene caricata una piccola descrizione li in quel frame con qualche caratteristica, poi ho i tasti MODIFICA, RIMUOVI, GESTISCI, AGGIORNA e VISUALIZZA ognuno con una propria funzionalità associata. Come dicevo ognuno di questi apre un altro frame e visualizza l'articolo nei dettagli, eccetto il tasto RIMUOVI che effetua una semplice rimozione dello stesso dal db dopo averne dato conferma in uno ShowMessageDialog.
    Ti faccio un esempio, apro il primo frame ed inizialmente il focus è sulla TextField, leggo il codice a barre e parte la query, se trova l'articolo mi da alcuni cenni sommari su di esso e sulla quantità in magazzino, poi ad esempio voglio modificarlo, premo modifica e mi si apre un altro frame con caricati all'interno tutti i dati relativi a tale articolo, modifico cio ke voglio, do conferma della modifica e si chiude questo secondo frame; adesso vorrei leggere un secondo codice a barra, dovrei portare il cursore di nuovo sulla textfield perchè il focus è rimasto sul bottone MODIFICA premuto in precedenza...una soluzione possibile potrebbe essere altrimenti che alla chiusura del secondo frame, alla pressione del tasto aggiorna su questo secondo frame, o cmq su qualsiasi operazione che conduce alla chiusura del secondo frame il focus venga riportato sulla text field del primo frame qualora questo esista. Te che ne pensi?

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    36
    ora la butto li...ma se invece di far scrivere la stringa nella text la fai scrivere in uno stream e fai un thread che rimane in ascolto e quando legge qualcosa fa quello che deve fare (tipo una chat)

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: ah

    Originariamente inviato da fabiolinux85
    una soluzione possibile potrebbe essere altrimenti che alla chiusura del secondo frame, alla pressione del tasto aggiorna su questo secondo frame, o cmq su qualsiasi operazione che conduce alla chiusura del secondo frame il focus venga riportato sulla text field del primo frame qualora questo esista.
    Sì questo può anche andare benissimo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6

    Come implementare il thread però?

    L'idea di roscio la vedo molto interessante tuttavia non sono pratico nell'utilizzo di thread in java, se avete qualche esempio da postare o linkare ve ne sarei grato...intanto mi attivo anche personalmente per studiarmi un pò la gestione dei thread in Java...

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    36
    guarda i thread non sono tanto difficili da utilizzare il problema potresti averlo nel creare lo stream dove scrivere...io feci una cosa del genere utilizzando un'implementazione della classe queue...ora qui non ho le classi...se è stasera le posto

  8. #8

    Ok

    Ti ringrazio, nel frattempo che aspetto le tue classi cerco di dare un'occhiata in giro, per quando riguarda la lettura da stdin con il lettore barcode ho redatto un piccolo metodo che funziona perfettamente, eccetto per il fatto che comunque la lettura da stdin è una chiamata bloccante e questo fa si che mi vadi a bloccare l'intera interfaccia grafica fino a che non digito un qualsiasi tasto da tastiera e do l'invio. Per ovviare a questa situazione ovviamente dovrei creare un thread che gestisce l'input in modalità non bloccante. Ho trovato in rete questo esempio e sto cercando di adattarlo al mio caso:
    codice:
    Si supponga di dover disegnare in maniera automatica e
    	ripetuta delle ellissi nella finestra grafica, e di voler
    	controllare gli attributi di tali ellissi mediante parole
    	chiave immesse da tastiera. Conviene separare il compito di
    	lettura e interpretazione (parsing) del flusso di caratteri
    	che viene dalla tastiera dal compito di produzione dell'output
    	grafico. Ciò si può realizzare come segue, nel caso semplice
    	in cui le parole accettate siano "rosso", "verde", e "blu"
    	corrispondenti a diverse colorature delle ellissi prodotte.
    	  
    
    
    
    StringBuffer stdin;
    boolean linea;
    color colore;
    
    void keyReleased() {
      char c = key;
      if (c!='\n') {
        stdin.append(c);
      }
      else linea=true;
    }
    
    class ColorInput extends Thread {
      String results;
      char c;
     
      void run()  {
         while(true) {
           if (linea) {
                println(stdin);
                results=stdin.toString();
                stdin.setLength(0);	    
                linea = false;
                if (results.equals("rosso")) {
                    colore = color(255, 0, 0);
                }
                 if (results.equals("verde")) {
                    colore = color(0, 255, 0);
                }
                if (results.equals("blu")) {
                    colore = color(0, 0, 255);
                }          
              }
             try {
             sleep(5); // to relief the cpu from active waiting
             } catch (Exception e) {println("Exception in sleep");} 
            }
        }
      }
    
    class TimerThread extends Thread{
      int timediff; // quanto temporale
      
      TimerThread(int td) {
       timediff = td;
      }
      
     void run() {
       while(true) {
         try {   
           fill(colore);
           ellipse(int(random(100)), int(random(100)), 
             int(random(20)), int(random(20)));  
           sleep(timediff);
         } catch (Exception e) {println("Exception in sleep");}
       }
     } 
    }
    
    void setup() {
     stdin = new StringBuffer();
     TimerThread tt1 = new TimerThread(100);
     ColorInput ci = new ColorInput();
     ci.start();
     tt1.start(); 
    }
    
    void draw() {
    }

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Ok

    Originariamente inviato da fabiolinux85
    per quando riguarda la lettura da stdin con il lettore barcode ho redatto un piccolo metodo che funziona perfettamente, eccetto per il fatto che comunque la lettura da stdin è una chiamata bloccante e questo fa si che mi vadi a bloccare l'intera interfaccia grafica fino a che non digito un qualsiasi tasto da tastiera e do l'invio. Per ovviare a questa situazione ovviamente dovrei creare un thread che gestisce l'input in modalità non bloccante.
    Consiglio: lascia perdere questo sistema che trovo solo lungo e "fumoso".
    Se leggi dallo standard-input devi appunto usare un thread a sé stante e oltretutto devi anche avere la "console" attiva.

    Ci sono altre soluzioni, una ad esempio è sfruttare il KeyboardFocusManager disponibile da Java 1.4.

    codice:
    KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    
    kfm.addKeyEventDispatcher(new KeyEventDispatcher() {
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() == KeyEvent.KEY_TYPED) {
                System.out.println("Premuto tasto: " + e.getKeyChar());
            }
    
            return false;
        }
    });
    Con questo semplice codice puoi ricevere notifica della digitazione di un carattere indipendentemente dal componente nella tua interfaccia che ha il "focus"!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10

    RISOLTO

    Vi ringrazio per l'interessamento al mio problema, ho risolto come suggeritomi da andbin, posto il codice funzionante:

    codice:
    public void readfromStdin() {
            KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            kfm.addKeyEventDispatcher(new KeyEventDispatcher() {
                public boolean dispatchKeyEvent(KeyEvent e) {
                    if (e.getID() == KeyEvent.KEY_TYPED && e.getKeyChar() != KeyEvent.VK_ENTER){
                        c = c.concat(String.valueOf(e.getKeyChar()));
                    }
                    if (e.getID() == KeyEvent.KEY_TYPED && e.getKeyChar() == KeyEvent.VK_ENTER){
                        try {
                            if (stato == false) {
                                interrogadb(c);
                                stato = true;
                            } else {
                                stato = false;
                                c="";
                            }
                        } catch (IOException ex) {
                            Logger.getLogger(RichiamaArticolo.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                    return false;
                }
            });
        }
    allora, nella definizione delle variabili del JInternalFrame inizializzo una variabile String c come stringa vuota.
    Poi nel costruttore della classe invoco il metodo readfromStdin() , questo si mette in ascolto di tutto ciò che digito da tastiera (nel mio caso acquisisco da scanner BarCode) e ad ogni carattere aggiorna la variabile c concatenandole un nuovo carattere letto fino a che non legge il carattere ENTER.
    Quando legge il carattere ENTER mi attiva il metodo interrodadb(String c) passandogli come parametro la stringa composta in precedenza.
    A questo punto il metodo interrogadb(String c) effettua la query e mi restituisce il risultato di essa.

    Ho dovuto mettere quella variabile stato di tipo booleano definita anch'essa nella classe JInternalFrame perchè il tasto enter viene premuto 2 volte alla fine di ogni lettura da parte del barcode.
    Quindi setto inizialmente stato a false; alla prima pressione dell'ENTER questa è settata a false , la setta a true e invoca interrogadb(c); alla seconda lettura la trova già a true quindi evita di effettuare un'ennesima interrogazione in cascata ma me la risetta a false per le successive letture e assegna nuovamente alla variabile string c della classe il valore stringa vuota così da evitare che alla lettura dei codici successivi questi vengano concatenati ai precedenti.

    FINE..... GRAZIE A TUTTI

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.