Come interagire in un ciclo condizionale.

di il
5 risposte

Come interagire in un ciclo condizionale.

Salve a tutti del forum,
Ho fatto un programma formato da un Jpanel dove all'interno vi sono delle JTextField e dei pulsanti, uno per avviare il ciclo FOR (elaborazione dati) e un'altro per uscire dal programma, il classico EXIT.

Il programma, attraverso un ciclo FOR, scansiona un ArrayList<ArrayList<String>> e visualizza i dati nelle JTextField.

In particolare il primo ArrayList rappresenta un record mentre gli item del secondo sono campi di tipo String e i loro valori sono visualizzati nelle JTextField.

Il risultato è che velocemente vengono visualizzate, per ogni ciclo (record), tutti i campi nelle JTextField dall'inizio fino alla fine.

Il problema, che sto ora affrontando, è che in determinati casi, un valore (visualizzato anche da una JTextField) potrebbe essere erroneo e pertanto deve essere corretto inserendo il valore attraverso la JTextBox (la stessa che visualizza i valori) oltre che aggiornare il campo nell'arraylist di quel record.

L'algoritmo che si accorge di questa anomalia è cablata all'interno dello stesso ciclo for e funziona normalmente ossia quando è rilevato l'errore ho il punto di accesso per fare qualcosa.

Al momento, per inserire il nuovo valore, l'ho risolto richiamando, dall'interno dell'algoritmo, una JInputBox che mi consente di inserire il valore corretto, inserisco il valore nell'arraylist del campo associato e a video mentre il ciclo for riprende a funzionare.

Tuttavia, il fatto di dover richiamare una inputbox non mi piace. DOMANDA:

Durante il funzionamento del ciclo for, quando l'algoritmo trova il valore scorretto, come posso sospendere il ciclo stesso per poter inserire il dato nuovo in una JTextField e successivamente, cliccando un pulsante nel JPanel tipo ACETTA, far riavviare il ciclo stesso?

Quello che mi interessa sapere è quale sia la logica da applicare in questi casi.

In passato, con VB6, ero solito inserire una DBGrid che visualizzava tutti i valori e successivamente li andavo ad editare.

Non so se mi sto perdendo in un bicchiere d'acqua o è la stanchezza oppure, più plausibile, semplicemente ignoranza (del resto io ci sono nato!!).

Grazie a tutti, ancor di più per chi risponde!!
cnesan

5 Risposte

  • Re: Come interagire in un ciclo condizionale.

    cnesan ha scritto:


    Durante il funzionamento del ciclo for, quando l'algoritmo trova il valore scorretto, come posso sospendere il ciclo stesso per poter inserire il dato nuovo in una JTextField e successivamente, cliccando un pulsante nel JPanel tipo ACETTA, far riavviare il ciclo stesso?
    Premessa: se questo ciclo è eseguito a fronte di un "evento" (es. di pulsante), il ciclo lo esegui nel contesto del Event Dispatch Thread. Che non va mai tenuto "impegnato" per troppo tempo, altrimenti la interfaccia risulta "congelata" in quel frangente.
    Quindi finché quel codice impiega frazioni di secondo, nessun problema. Pertanto il senso del "sospendere" è dubbio, cioè se intendi che il ciclo resti lì in mezzo appeso ad attendere dell'input, questo è molto critico. Il controllo va fatto ritornare al framework il prima possibile.

    Quello che puoi fare è terminare il ciclo (break, return ... dipende), segnalare il problema all'utente in qualche modo (campo messo in rosso, una message box ecc...) e terminare la gestione dell'evento (actionPerformed se è da un ActionListener).
    Poi l'utente correggerà e riproverà.

    Non sapendo o vedendo altro ... è un po' difficile darti indicazioni maggiori.
  • Re: Come interagire in un ciclo condizionale.

    L'approccio e' potenzialmente sbagliato:

    1) PRIMA si fa il controllo sulla bonta'/validita' dei dati e, in caso di valori strani per qualche motivo, si fanno le opportune correzioni
    2) POI si fa l'elaborazione dei dati, che si sa gia' essere buoni

    Il motivo e' ovvio:

    a) separare due attivita' che per loro natura non centrano nulla l'una con l'altra
    b) mantenere il codice pulito, cioe' ogni pezzo di codice fa un solo lavoro
    c) semplificare la manutenzione: se ci sono delle correzioni da fare, le fai solo sul pezzo di codice interessato e non rischi di scassare altri pezzi di codice che sai gia' che funzionano correttamente

    Quindi, come fare?

    Usi la tua IU (Interfaccia Utente) per visualizzare i dati PRIMA dell'elaborazione, con un qualche pupazzetto che dice quale riga e' problematica, e perche'.
    Quindi dai all'utente la possibilita' di fare le correzioni e i check di validita' (e dici se e' tutto a posto o ci sono ancora errori) e un pulsante per processare i dati
  • Re: Come interagire in un ciclo condizionale.

    Prima di tutto grazie per aver risposto.

    Per andbin, l'evento pulsante è collegato ad una sequenza di comandi quali:
    - Disabilitazione delle JComboBox e dei pulsanti Make eExit
    - Lancio di un thread (task) che a sua volta lancia il metodo make(), questo fa in modo di non congelare l'interfaccia grafica.
    Il metodo make(), una volta terminato riattiva i controlli.

    Per migliorabile, l'elaborazione è composta dalla scansione dell'arraylist al fine di verificare che i dati presenti siano corretti.
    Nel raro caso che un dato non sia corretto, il software si ferma in attesa che l'operatore inserisca il valore corretto.

    Per questo ho usato una JInputBox e il sw funziona. Il problema è che la JInputBox si va a sovrapporre al centro del form che intanto visualizza i dati che servono all'operatore.

    La visualizzazione dei dati serve all'operatore per sapere la corrispondenza es.: Nominativo/Indirizzo1/Indirizzo2 -> Tracking Number inserito (manualmente).

    Saluti
    cnesan
  • Re: Come interagire in un ciclo condizionale.

    Quello che volevo sapere era se possibile inserire il comportamento della JInputBox nella JPanel (con i controlli di input).

    Inoltre, con eclipse non sono mai riuscito a vsualizzare due sorgenti contemporaneamente. Sapete come si fa?

    Grazie
    cnesan
  • Re: Come interagire in un ciclo condizionale.

    Una Jtable editabile?
Devi accedere o registrarti per scrivere nel forum
5 risposte