Lo scopo principale di un'applicazione informatica sta nella capacità di risolvere una classe di problemi in modo veloce e sicuro. I problemi della stessa classe hanno soluzioni diversa a seconda del valore di uno o più parametri iniziali in base ai quali sviluppare l'applicazione e pervenire a uno o più risultati conseguenti. Bisogna quindi che un'applicazione, diversamente dagli esempi proposti nelle pagine precedenti, sia di volta in volta in grado di acquisire dagli utenti i valori iniziali di questi parametri.
La situazione più semplice è quella in cui un'applicazione acquisisce i valori di questi parametri, rappresentati da stringhe numeriche o alfanumeriche, direttamente da tastiera e viene attivata da un click su un bottone.
Per acquisire caratteri dalla tastiera è disponibile la classe JTextField visualizzata nel componente che la contiene da un campo che, se selezionato, mostra di seguito i caratteri premuti sulla tastiera.
Per recepire i click dal mouse dell'utente è disponibile la classe JButton. Ad ogni bottone puà essere associato un comando con il metodo JButton.setActionCommand(String actionCommand). Un click sul bottone genera un evento che deve essere captato dall'applicazione. A questo scopo l'applicazione deve essere dorata dell'interfaccia ActionListener e di un metodo public void actionPerformed(ActionEvent e) che, a seconda dell'evento captato, specifichi l'opportuna risposta. Se la risposta è una stringa alfanumerica può essere assegnata al testo di un componente JLabel.
Per esemplificare i concetti proposti si propone un'applicazione che, dato l'anno che deve essere successivo alla riforma gregoriana del calendario, calcola la data della Pasqua cattolica per quell'anno.
La sequenza di preparazione dell'applicazione è la seguente.
L'aspetto grafico dell'applicazione è il seguente
Una volta preparato l'aspetto grafico dell'applicazione, bisogna specificare come essa reagisce agli input dell'utente, compilando il metodo actionPerformed(ActionEvent e) in cui si specifica che, se il comando non è "reset" bisogna rilevare l'anno scritto in textfield_input e, se possibile, calcolare la data della Pasqua corrispondente.
Bisogna quindi preparare una funzione che in base ai necessari calcoli astronomici, produca l'output corrispondente da assegnare come testo a label_outout.
Provare il seguente esempio.
import java.awt.*; import javax.swing.*; import java.awt.event.*; //========================================================================== public class Pasqua extends JFrame implements ActionListener { Container contenitore; JPanel pannello_intestazione, pannello_input, pannello_output; JLabel label_intestazione, label_output; JTextField textfield_input; JButton button_reset, button_calcolo; static String[] nome_mese = {"","Gennaio","Febbraio","Marzo","Aprile", "Maggio","Giugno","Luglio","Agosto","Settembre", "Ottobre", "Novembre","Dicembre"}; //-------------------------------------------------------------------------- public Pasqua() { setTitle("Pasqua"); int larghezza = 300; int altezza = 140; setPreferredSize(new Dimension(larghezza,altezza)); contenitore = getContentPane(); setResizable(false); altezza = 32; contenitore.setLayout(new BoxLayout(contenitore,BoxLayout.Y_AXIS)); pannello_intestazione = new JPanel(); pannello_intestazione.setPreferredSize(new Dimension(larghezza,altezza)); pannello_intestazione.setBackground(new Color(70,180,80)); pannello_intestazione.setBorder(BorderFactory.createRaisedBevelBorder()); label_intestazione = new JLabel("Data della Pasqua cattolica"); pannello_intestazione.add(label_intestazione); add(pannello_intestazione); pannello_input = new JPanel(); pannello_input.setPreferredSize(new Dimension(larghezza,altezza)); pannello_input.setBackground(new Color(90,160,90)); pannello_input.setBorder(BorderFactory.createRaisedBevelBorder()); pannello_input.setLayout(new BoxLayout(pannello_input,BoxLayout.X_AXIS)); button_reset = new JButton(" RESET "); button_reset.setBackground(Color.yellow); button_reset.addActionListener(this); button_reset.setActionCommand("reset"); pannello_input.add(button_reset); textfield_input = new JTextField(); pannello_input.add(textfield_input); button_calcolo = new JButton("CALCOLO"); button_calcolo.setBackground(Color.red); button_calcolo.setActionCommand("calcolo"); button_calcolo.addActionListener(this); pannello_input.add(button_calcolo); add(pannello_input); pannello_output = new JPanel(); pannello_output.setPreferredSize(new Dimension(larghezza,altezza)); pannello_output.setBackground(new Color(30,220,140)); pannello_output.setBorder(BorderFactory.createRaisedBevelBorder()); label_output = new JLabel(" "); pannello_output.add(label_output); add(pannello_output); } //-------------------------------------------------------------------------- public void actionPerformed(ActionEvent e) { String comando= e.getActionCommand(); if (comando=="reset") { textfield_input.setText(""); label_output.setText(""); return; }; String input = textfield_input.getText(); String data = dataPasqua(input); if (data.length()==0) label_output.setText(input+": input non ammesso."); else label_output.setText(data); } //-------------------------------------------------------------------------- String dataPasqua(String input) { int anno; try { anno = Integer.parseInt(input); } catch(NumberFormatException ecc) { return ""; } int numero_oro = anno % 19; int secolo = anno/100; int epatta = (secolo- secolo/4 - (8*secolo+13)/25 + 19*numero_oro + 15) % 30; int luna_piena = epatta - (epatta/28)*(1-(29/(epatta+1))*((21-numero_oro)/11)); int correzione = (anno + anno/4 + luna_piena + 2 - secolo + secolo/4) % 7; int differenza = luna_piena - correzione; int mese = 3 + (differenza+40)/44; int giorno = differenza + 28 - 31*(mese/4); String data = "Pasqua: "+giorno+" "+nome_mese[mese]+" "+anno; return data; } //-------------------------------------------------------------------------- public static void main(String args[]) { Pasqua p = new Pasqua(); p.pack(); p.setVisible(true); } } //==========================================================================
Scrivendo 2020 nel campo di input e cliccando "CALCOLO" si ottiene