PROVA FINALE Ingegneria del software Ing. Jody Marca jody.marca@polimi.it Laboratorio N 3
Cosa faremo oggi 2 Interfaccia grafica e SWING Lettura e scrittura di Files di properties Internazionalizzazione del codice
Swing 3 Swing è l evoluzione di AWT (Abstract Windowing Toolkit) e contrariamente a quest ultima non utilizza il SO per disegnare ma Java quindi è multipiattaforma Cambiamo prospettiva e ragioniamo ad eventi! Occorrenza dell evento A Occorrenza dell evento B Realtà Applicazione Osservatori Notifica dell evento A Notifica dell evento B Ascoltatore evento A Ascoltatore evento A listeners Ascoltatore evento B
Swing \2 4 Swing implementa il paradigma MVC (Model View Controller). Separate sempre i dati, visualizzazione e logica applicativa; rendeteli il più possibile indipendenti. Un interfaccia Swing ha tre elementi fondamentali: Contenitori Elementi grafici Eventi
Swing - Contenitori 5 Top level containers General purpose containers
Swing Contenitori \ 2 6 Special purpose containers
Swing - Elementi grafici 7 Elementi grafici di base
Swing - Elementi grafici \ 2 8 Elementi grafici non editabili Elementi grafici con contenuto formattato
Swing - Primo esempio 9 Primo esempio: JFrame + JLabel import java.awt.dimension; import javax.swing.*; public class SwingTest { private static void createandshowgui() { JFrame frame = new JFrame("Swing Test"); frame.setpreferredsize(new Dimension(300, 100)); frame.setdefaultcloseoperation(jframe.exit_on_close); JLabel label = new JLabel("Ciao sono una Swing JLabel"); frame.getcontentpane().add(label); frame.pack(); frame.setvisible(true); public static void main(string[] args) { javax.swing.swingutilities.invokelater(new Runnable() { public void run() { createandshowgui(); );
Swing - Eventi 10 Ogni evento ha un proprio Listener (gestore), consultate i Javadocs http://download.oracle.com/javase/6/docs/api/index.html?javax/swing/e vent/package-summary.htm
Swing - Layout 11 Esistono diversi tipi di Layout Manager: BorderLayout BoxLayout CardLayout FlowLayout GridBagLayout GridLayout GroupLayout SpringLayout Gli esempi li trovate al sito: http://download.oracle.com/javase/tutorial/uiswing/layout/index.html
Swing - Secondo esempio 12 Secondo esempio: Eventi + Layout import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SwingTest2 extends JPanel implements ActionListener { private static final String NUMEROCL = "Numero di pressioni "; protected JButton bottone; protected JLabel textlabel; protected Integer numclick; public SwingTest2() { numclick = 0; textlabel = new JLabel(NUMEROCL + numclick); add(textlabel); bottone = new JButton("Cliccami o premi Alt"); bottone.setverticaltextposition(abstractbutton.center); bottone.sethorizontaltextposition(abstractbutton.center); bottone.setmnemonic(keyevent.vk_alt); bottone.addactionlistener(this); bottone.settooltiptext("clicca il bottone o premi Alt"); add(bottone);
Swing - Secondo esempio \ 2 13 public void actionperformed(actionevent e) { numclick++; textlabel.settext(numerocl + numclick); private static void createandshowgui() { JFrame frame = new JFrame("Swing Test 2"); frame.setpreferredsize(new Dimension(200, 100)); frame.setdefaultcloseoperation(jframe.exit_on_close); SwingTest2 contentpane = new SwingTest2(); contentpane.setopaque(true); contentpane.setlayout(new FlowLayout(FlowLayout.CENTER)); frame.setcontentpane(contentpane); frame.pack(); frame.setvisible(true); public static void main(string[] args) { javax.swing.swingutilities.invokelater(new Runnable() { public void run() { createandshowgui(); );
Swing - Terzo esempio 14 Secondo esempio: Inner (o Nested) Class import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SwingTest3 extends JPanel { private static final String NUMEROCL1 = "Numero di perssioni bottone uno: "; private static final String NUMEROCL2 = "Numero di perssioni bottone due: "; protected JButton bottone1, bottone2; protected JLabel textlabel, textlabe2; protected Integer numclick1, numclick2; private static void createandshowgui() { JFrame frame = new JFrame("Swing Test 3"); frame.setpreferredsize(new Dimension(300, 200)); frame.setdefaultcloseoperation(jframe.exit_on_close); SwingTest3 contentpane = new SwingTest3(); contentpane.setopaque(true); contentpane.setlayout(new FlowLayout(FlowLayout.CENTER)); frame.setcontentpane(contentpane); frame.pack(); frame.setvisible(true);
Swing - Terzo esempio \ 2 15 public SwingTest3() { numclick1 = 0; textlabel = new JLabel(NUMEROCL1 + numclick1); add(textlabel); bottone1 = new JButton("Cliccami"); bottone1.setverticaltextposition(abstractbutton.center); bottone1.sethorizontaltextposition(abstractbutton.center); bottone1.addactionlistener(new Button1Listener()); bottone1.settooltiptext("clicca il bottone"); add(bottone1); numclick2 = 0; textlabe2 = new JLabel(NUMEROCL2 + numclick2); add(textlabe2); bottone2 = new JButton("Cliccami"); bottone2.setverticaltextposition(abstractbutton.center); bottone2.sethorizontaltextposition(abstractbutton.center); bottone2.addactionlistener(new Button2Listener()); bottone2.settooltiptext("clicca il bottone"); add(bottone2);
Swing - Terzo esempio \ 3 16 public static void main(string[] args) { javax.swing.swingutilities.invokelater(new Runnable() { public void run() { createandshowgui(); ); class Button1Listener implements ActionListener{ public void actionperformed(actionevent e) { numclick1++; textlabel.settext(numerocl1 + numclick1); class Button2Listener implements ActionListener{ public void actionperformed(actionevent e) { numclick2++; textlabe2.settext(numerocl2 + numclick2);
Swing - Esercizio 17 Creare un piccolo programma per giocare a Morra cinese Il programma presenterà all utente tre bottoni sasso, carta e forbici ed estrarrà la scelta del computer decretando la patta o la vittoria del computer o dell utente.
Files di Properties 18 I files di properties sono dei particolari file nella struttura chiave=valore utili a contenere dei parametri di configurazione La loro gestione avviene attraverso la classe java.util.properties che estende la classe Hashtable Esempio di file di properies (esempio.properties ) bottone.tooltip=clicca il bottone bottone.name=cliccami
Files di Properties - Esempio 19 public static void main(string[] args) throws Exception { //Creo l istanza della classe Properties Properties propertiesdiesempio = new Properties(); FileInputStream input = new FileInputStream("esempio.properties"); propertiesdiesempio.load(input); //Leggo le Properties input.close(); //Leggo il valore con chiave bottone.name String name = propertiesdiesempio.getproperty("bottone.name"); //Modifico il valore con chiave bottone.name propertiesdiesempio.setproperty("bottone.name", Clicca qui"); FileOutputStream out = new FileOutputStream("esempio.properties"); //Salvo le Properties aggiornate propertiesdiesempio.store(out, "--- Configurazioni SWING ---"); out.close();
Internazionalizzazione 20 L internazionalizzazione del codice si basa sull estenalizzazione delle stringhe in speciali files di properties chiamati ResourceBundle La particolarità di questi file è quella di essere tipizzati da un suffisso che rappresenta il Locale (lingua + paese) del contenuto del file Il software leggerà il ResourceBundle in base al Locale in uso e utilizzerà le stringhe in esso contenute
ResourceBundle 21 È sempre necessario definire un default ResourceBundle. myappi18n.properties stringa.saluta=ciao stringa.comeva=come va? stringa.tuonome=come ti chiami? Definiamo inoltre un ResourceBundle per ogni lingua che si vuole gestire (esempio inglese USA) myappi18n_en_us.properties stringa.saluta=hi stringa.comeva=how are you?
Esempio - ResourceBundle 22 public static void main(string[] args) { //Setto il locale a italiano (_it) Locale locale = Locale.ITALIAN; //Leggo il ResourceBundle ResourceBundle mess = ResourceBundle.getBundle("i18n.myAppI18N",locale); System.out.println(mess.getString("stringa.saluta")); System.out.println(mess.getString("stringa.comeva")); System.out.println(mess.getString("stringa.tuonome")); //Setto il locale a inglese USA (_en_us) locale = new Locale("en", "US"); messages = ResourceBundle.getBundle("i18n.myAppI18N",locale); System.out.println(mess.getString("stringa.saluta")); System.out.println(mess.getString("stringa.comeva")); System.out.println(mess.getString("stringa.tuonome"));