Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    20

    Input indesiderato alla ricomparsa del menù

    Ho un menù che cicla all'infinito finché l'utente non digita un carattere per uscire dal programma.
    Il problema è che una volta selezionata un'opzione da tale menù, e una volta terminata l'operazione corrispondente, il menù ricompare ma è come se accettasse automaticamente il carattere di invio senza dare la possibilità all'utente di digitare un nuovo carattere.
    Dato che appunto viene inviato implicitamente un comando non valido, ricompare nuovamente il menù che stavolta attende l'input, come effettivamente dovrebbe funzionare.

    codice:
        public static void menu()
        {
            char input;
            boolean done = false;
            
            while (!done)
            {
                System.out.println();
                System.out.println("SELEZIONARE UN COMANDO\n");
                System.out.println("  A = Stampa i titoli principali di entrambi i quotidiani");
                System.out.println("  B = Elenca tutti i titoli di un quotidiano");
                System.out.println("  C = Confronta due notizie");
                System.out.println("  E = Esci dall'applicazione\n");
    
                try
                {
                    input = (char)System.in.read();
    
                    int c = (int)input;        /* ho aggiunto queste due istruzioni */
                    System.out.println(c);     /* per verificare il carattere selezionato */
                    
                    switch (input)
                    {
                        case 'A':
                        case 'a':
                            comando1();
                            break;
                        case 'B':
                        case 'b':
                            comando2();
                            break;
                        case 'C':
                        case 'c':
                            comando3();
                            break;
                        case 'E':
                        case 'e':
                            done = true;
                            break;
                        default:
                            System.out.println("valore non corretto\n\n");
                    }
                }
                catch (IOException e)
                {
                    //gestisco l'eccezione
                }
            }
        }
    L'output è il seguente:

    codice:
    SELEZIONARE UN COMANDO
    
      A = Stampa i titoli principali di entrambi i quotidiani
      B = Elenca tutti i titoli di un quotidiano
      C = Confronta due notizie
      E = Esci dall'applicazione
    
    a
    97
    
    /* stampa dei titoli */
    
    
    SELEZIONARE UN COMANDO
    
      A = Stampa i titoli principali di entrambi i quotidiani
      B = Elenca tutti i titoli di un quotidiano
      C = Confronta due notizie
      E = Esci dall'applicazione
    
    10                            /* da qui deduco che il programma prende automaticamente l'invio */
    valore non corretto           /* (che tuttavia non è stato digitato se non al passo precedente) */
    
    
    
    SELEZIONARE UN COMANDO
    
      A = Stampa i titoli principali di entrambi i quotidiani
      B = Elenca tutti i titoli di un quotidiano
      C = Confronta due notizie
      E = Esci dall'applicazione
    
    e
    101
    Come faccio ad evitare quel passo intermedio in cui prende l'invio senza che io l'abbia digitato?
    Ho provato anche con un oggetto Scanner, ma non ho risolto.

    Grazie in anticipo per l'eventuale illuminazione.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    non hai letto tutta la linea, leggi un carattere.

    codice:
    input = (char)System.in.read();
    ma il buffer resta sporco appunto con l'invio.

    Prova ad usare altri metodi per la lettura dell'input (banalmente un oggetto Scanner che wrappa System.in)
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    20
    Ho voluto prendere un solo carattere proprio perché nello switch ho messo solo caratteri.
    Se ci fai caso, ho anche scritto:

    Ho provato anche con un oggetto Scanner, ma non ho risolto.
    Riprovo con lo Scanner, incollo codice e output, magari ho sbagliato da qualche altra parte...

    EDIT: per non fare troppe prove a vuoto, che metodo devo usare con l'oggetto scanner per ottenere un char da copiare nella variabile input?
    Forse nextShort() da castare in char?
    Oppure un semplice next() per poi prendere il primo carattere della stringa tramite charAt(0)?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    guarda questo a me funziona
    codice:
    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String arg[]) {
    		char input;
    		boolean done = false;
    		Scanner sc = new Scanner(System.in);
    
    		while (!done) {
    			System.out.println();
    			System.out.println("SELEZIONARE UN COMANDO\n");
    			System.out
    					.println("  A = Stampa i titoli principali di entrambi i quotidiani");
    			System.out.println("  B = Elenca tutti i titoli di un quotidiano");
    			System.out.println("  C = Confronta due notizie");
    			System.out.println("  E = Esci dall'applicazione\n");
    
    			try {
    				input = sc.nextLine().charAt(0);
    
    				System.out.println(input); /*
    											 * per verificare il carattere
    											 * selezionato
    											 */
    
    				switch (input) {
    				case 'A':
    				case 'a':
    					// comando1();
    					break;
    				case 'B':
    				case 'b':
    					// comando2();
    					break;
    				case 'C':
    				case 'c':
    					// comando3();
    					break;
    				case 'E':
    				case 'e':
    					done = true;
    					break;
    				default:
    					System.out.println("valore non corretto\n\n");
    				}
    			} catch (Exception e) {
    				// gestisco l'eccezione
    				e.printStackTrace();
    			}
    		}
    	}
    }
    guarda che se usi java7 puoi fare lo switch sulle stringhe
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    20
    Ho risolto con

    codice:
    scanner = new Scanner(System.in);
    input = scanner.next().charAt(0);
    Non che non mi piaccia come soluzione, ma esiste un'alternativa meno "articolata"?
    Perché così mi accetta anche una parola...

    Ed esiste un modo per dargli in pasto un carattere senza premere invio?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    guarda qui
    RTFM Read That F*** Manual!!!

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    20
    Originariamente inviato da valia
    guarda qui
    Grazie mille!

    Devo editare il titolo?

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    prego
    no, non è necessario
    RTFM Read That F*** Manual!!!

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.