Ing. Jody Marca – jody.marca@polimi.it
Laboratorio N° 3
© 2015 – Jody Marca – Laboratorio numero 3
Cosa faremo oggi
Interfaccia grafica e SWING
Lettura e scrittura di Files di properties
Internazionalizzazione del codice
Swing
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
Osservatori
Realtà Applicazione
Ascoltatore evento A Ascoltatore
evento A
Ascoltatore evento B
Occorrenza dell’evento B
Notifica
dell’evento A Notifica dell’evento B
listeners
© 2015 – Jody Marca – Laboratorio numero 3
Swing \2
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
Top level containers
General purpose containers
© 2015 – Jody Marca – Laboratorio numero 3
Swing – Contenitori \ 2
Special
purpose
containers
Swing - Elementi grafici
Elementi grafici di base
© 2015 – Jody Marca – Laboratorio numero 3
Swing - Elementi grafici \ 2
Elementi grafici non editabili
Elementi grafici con contenuto formattato
Swing - Primo esempio
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();
} });
} }
© 2015 – Jody Marca – Laboratorio numero 3
Swing - Eventi
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
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
© 2015 – Jody Marca – Laboratorio numero 3
Swing - Secondo esempio
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
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(); } });
} }
© 2015 – Jody Marca – Laboratorio numero 3
Swing - Terzo esempio
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
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);
}
© 2015 – Jody Marca – Laboratorio numero 3
Swing - Terzo esempio \ 3
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
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.
© 2015 – Jody Marca – Laboratorio numero 3
Files di Properties
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
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();
}
© 2015 – Jody Marca – Laboratorio numero 3
Internazionalizzazione
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
È 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?
© 2015 – Jody Marca – Laboratorio numero 3