Commenti al FILE Calcolatrice.java ---------------------------------- Una possibile soluzione dell'esercizio di laboratorio sulla calcolatrice. Non e' l'unica soluzione. Nell'implementare la calcolatrice sono state fatte alcune scelte che non sono le uniche possibili. La calcolatrice e' sotto-classe di Frame. Ha un un array di 16 bottoni per le 10 cifre e per i comandi + - * / = C e ha un campo di testo (non editabile) per mostrare il numero corrente. Lo spazio della finestra e' organizzato secondo un layout manager di tipo BorderLayout. A nord il campo di testo e a sud un pannello organizzato secondo un layout manager di tipo GridLayout 4x4 in cui si trovano i bottoni, Lo stato della calcolatrice e' dato da: - due variabili intere arg1 e arg2 (gli argomenti dell'operazione) - una variabile carattere operaz (l'operazione impostata + - * /) - il numero correntemente mostrato (si trova direttamente nel campo di testo e non serve un'altra variabile) - lo stato, che puo' assumere uno di quattro valori rappresentati da costanti intere: HO_NIENTE (arg1, operaz, arg2 indefiniti) HO_ARG1 (arg1 definito, operaz e arg2 no) HO_OP (arg1 e operaz definiti, arg2 no) HO_ARG2 (arg1, operaz, arg2 definiti) Il costruttore Calcolatrice() crea un frame di tipo calcolatrice, non lo visualizza ancora. Lo stato iniziale e' HO_NIENTE. La reazione agli eventi e' gestita dalla stessa classe Calcolatrice, che implementa l'interfaccia ActionListener. Ad ognuno dei 16 bottoni viene associata la calcolatrice stessa (this) come event listener. La funzione main costruisce e visualizza una calcolatrice. Associa alla calcolatrice un event listener per gestire la chiusura della finestra. La funzione aggiornaStato(int s) aggiorna l'interfaccia portandola in stato s: memorizza il nuovo stato, abilita e disabilita i bottoni a seconda del nuovo stato e assegna il numero visualizzato nel campo di testo. Ognuno dei quattro stati della calcolatrice prevede alcuni bottoni disabilitati e altri abilitati. Per ogni stato viene definita una bitmask a 16 posizioni (in corrispondenza diretta con le posizioni dell'array dei bottoni) dove si trova 0 se il bottone deve essere disabilitato e 1 se deve essere abilitato. La funzione ausiliaria eseguiAbilitazioni(int[] bitmask) abilita e disabilita bottoni in base alla bitmask. Per chiarezza colora i bottoni abilitati in verde e i disabilitati in rosso. Le funzioni tastoCifra(char c) e tastoFunzione(char c) sono chiamate dalla funzione actionPerformed(ActionEvent e) incaricata di gestire le reazioni dei bottoni, a seconda del tipo di bottone. La funzione tastoCifra(char c) gestisce i tasti cifra 0 1 2 3 4 5 6 7 8 9. Ricava la cifra numerica corrispondente al carattere c e poi, a seconda dello stato, aggiorna la variabile arg1 o arg2. La funzione tastoFunzione(char op) gestisce i tasti funzione + - * / = C. A seconda dello stato attuale e del tasto premuto, se necessario esegue un'operazione aritmetica, e se necessario cambia stato. Si serve della funzione ausiliaria eseguiOperazione(char op), che esegue l'operazione aritmetica corrispondente al carattere op. La funzione actionPerformed(ActionEvent e) implementa la corrispondente funzione dichiarata nell'interfaccia ActionListener. Questa funzione gestisce il comportamento di tutti i bottoni della calcolatrice. Risale al carattere che etichetta il bottone premuto. Se e' una cifra, demanda il lavoro alla funzione tastoCifra, altrimenti alla funzione tastoFunzione.