Title: Ancora sugli Eventi
1Ancora sugli Eventi
2Modello 1.1
3multiListenerDemo
- package listenersdemo
- import javax.swing. import java.awt.
import java.awt.event. - public class MultiListener
- extends JPanel implements ActionListener
- JTextArea topTextArea
- JTextArea bottomTextArea
- JButton button1, button2
- JLabel l null
- final static String newline "\n"
- public static void main(String args)
- createAndShowGUI()
-
4multiListenerDemo
- private static void createAndShowGUI()
- //Create and set up the window.
- JFrame frame new JFrame("MultiListener")
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_
CLOSE) - //Create and set up the content pane.
- JComponent newContentPane new
MultiListener() - frame.setContentPane(newContentPane)
- //Display the window.
- frame.pack()
- frame.setVisible(true)
-
5multiListenerDemo
- public MultiListener()
- super(new FlowLayout())
- l new JLabel("Cosa sento io")
- add(l)
- topTextArea new JTextArea()
- topTextArea.setEditable(false)
- JScrollPane topScrollPane new
JScrollPane(topTextArea) - Dimension preferredSize new Dimension(200,
75) - topScrollPane.setPreferredSize(preferredSize)
- add(topScrollPane)
- l new JLabel("Cosa sente la spia")
- add(l)
- bottomTextArea new JTextArea()
- bottomTextArea.setEditable(false)
-
6multiListenerDemo
- JScrollPane bottomScrollPane new
JScrollPane(bottomTextArea) - bottomScrollPane.setPreferredSize(preferredSiz
e) - add(bottomScrollPane)
- button1 new JButton("Fra Martino
campanaro") - add(button1)
- button2 new JButton("Dormi tu?")
- add(button2)
- button1.addActionListener(this)
- button2.addActionListener(this)
- button2.addActionListener(new
Spia(bottomTextArea)) - setPreferredSize(new Dimension(400, 300))
-
- public void actionPerformed(ActionEvent e)
- topTextArea.append(e.getActionCommand()
newline) - topTextArea.setCaretPosition(topTextArea.getDo
cument().getLength()) -
7multiListenerDemo
- class Spia
- implements ActionListener
- JTextArea myTextArea
- public Spia(JTextArea ta)
- myTextArea ta
-
- public void actionPerformed(ActionEvent e)
- myTextArea.append(e.getActionCommand()
- MultiListener.newline)
- myTextArea.setCaretPosition(myTextArea.getDocu
ment().getLength()) -
8Design considerations
- The most important rule to keep in mind about
event listeners that they should execute very
quickly. Because all drawing and event-listening
methods are executed in the same thread, a slow
event-listener method can make the program seem
unresponsive and slow to repaint itself. - You might choose to implement separate classes
for different kinds of event listeners. This can
be an easy architecture to maintain, but many
classes can also mean reduced performance. - When designing your program, you might want to
implement your event listeners in a class that is
not public, but somewhere more hidden. A private
implementation is a more secure implementation.
9Low-Level Events and Semantic Events
- Events can be divided into two groups low-level
events and semantic events. Low-level events
represent window-system occurrences or low-level
input. Everything else is a semantic event. - Examples of low-level events include mouse and
key events both of which result directly from
user input. - Examples of semantic events include action and
item events. - Whenever possible, you should listen for semantic
events rather than low-level events. That way,
you can make your code as robust and portable as
possible. For example, listening for action
events on buttons, rather than mouse events,
means that the button will react appropriately
when the user tries to activate the button using
a keyboard alternative or a look-and-feel-specific
gesture.
10Listeners/Adapters
- public class MyClass implements MouseListener
- ...
- someObject.addMouseListener(this)
- ...
- / Empty method definition. /
- public void mousePressed(MouseEvent e)
- / Empty method definition. /
- public void mouseReleased(MouseEvent e)
- / Empty method definition. /
- public void mouseEntered(MouseEvent e)
- / Empty method definition. /
- public void mouseExited(MouseEvent e)
- public void mouseClicked(MouseEvent e)
...//Event listener implementation goes here...
11Listeners/Adapters
- / An example of extending an adapter class
instead of directly implementing a listener
interface. / - public class MyClass extends MouseAdapter
- ...
- someObject.addMouseListener(this)
- ...
- public void mouseClicked(MouseEvent e)
- //Event listener implementation goes
here - ...
-
12Inner classes
- //An example of using an inner class.
- public class MyClass extends JFrame
- ...
- someObject.addMouseListener(
- new MyAdapter())
- ...
- class MyAdapter extends MouseAdapter
- public void mouseClicked(MouseEvent e)
- ...//Event listener implementation goes
here... -
-
13Anonymous Inner classes
- //An example of using an inner class.
- public class MyClass extends JFrame
- ...
- someObject.addMouseListener(
- new MouseAdapter ()
- public void mouseClicked(MouseEvent
e) - ...//Event listener implementation
goes here... -
-
- )
-
-
14Inner classes
- An instance of InnerClass can exist only within
an instance of EnclosingClass and it has direct
access to the instance variables and methods of
its enclosing instance.
15Anonymous Inner classes
- //An example of using an inner class.
- public class MyClass extends JFrame
- ...
- someObject.addMouseListener(
- new MouseAdapter()
- public void mouseClicked(MouseEvent e)
- ...//Event listener implementation goes
here... -
- )
- ...
-
16Listeners supported by all Swing components
- component listener
- Listens for changes in the component's size,
position, or visibility. - focus listener
- Listens for whether the component gained or lost
the ability to receive keyboard input. - key listener
- Listens for key presses key events are fired
only by the component that has the current
keyboard focus. - mouse listener
- Listens for mouse clicks and mouse movement into
or out of the component's drawing area. - mouse-motion listener
- Listens for changes in the cursor's position over
the component. - mouse-wheel listener (introduced in 1.4)
- Listens for mouse wheel movement over the
component.
17Altri listeners
- action
- caret
- change
- documentundoable edit
- item
- listselection
- window
- Listeners speciali per componenti specifiche
(treeNodeExpansion, ecc)
18Fondamenti di Java
- Introduzione alla
- costruzione di GUI
- Pluggable Look Feel
19Pluggable LookFeel
20Scelta del LookFeel
public static void main(String args) try
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName())
catch (Exception e) new
SwingApplication() //Create and show the GUI.
UIManager.getCrossPlatformLookAndFeelClassName()
Returns the Java look and feel.
UIManager.getSystemLookAndFeelClassName()
Specifies the look and feel for the current
platform.
21Scelta del LookFeel
public static void main(String args) try
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.gtk.GTKLookAndFeel")
catch (Exception e) new
SwingApplication() //Create and show the GUI.
UIManager.getSystemLookAndFeelClassName(String
s) Specifies the look and feel for the platform
described by s.
22Available LookFeel
"com.sun.java.swing.plaf.gtk.GTKLookAndFeel"
Specifies the GTK look and feel. Introduced in
release 1.4.2. "javax.swing.plaf.metal.MetalLookA
ndFeel" Specifies the Java look and feel.
"com.sun.java.swing.plaf.windows.WindowsLookAndF
eel" Specifies the Windows look and feel.
Currently, you can use this look and feel only on
Microsoft Windows systems. "com.sun.java.swing.pla
f.motif.MotifLookAndFeel" Specifies the
CDE/Motif look and feel. This look and feel can
be used on any platform.
23Sezione Costruttori
24Definizione dei costruttori
- Se per una classe A non scrivo nessun
costruttore, il sistema automaticamente crea il
costruttore A() - Se invece definisco almeno un costruttore non
void, ad es. A(int s), il sistema non crea il
costruttore A()
25Definizione dei costruttori
- Se B è figlia di A, il costruttore di B come
prima cosa invoca A(), a meno che la prima
istruzione non sia una super.
A(int k) ...
A() ...
B(int k) super(k)...
B(int k) ...
26Invocazione dei costruttori
- public class A
- public A()
- System.out.println("Creo A")
-
-
- public class B extends A
- public B()
- System.out.println("Creo B")
-
- public B(int k)
- System.out.println("Creo B_int)
-
Output Creo A Creo B_int
public static void main(String a) B
bnew B(1)
27Invocazione dei costruttori
- public class A
- public A(int k)
- System.out.println("Creo A")
-
-
- public class B extends A
- public B()
- System.out.println("Creo B")
-
- public B(int k)
- System.out.println("Creo B_int)
-
Output ERRORE ! Perchè ?
public static void main(String a) B
bnew B(1)
28Sezione Modificatori
- Abstract e Controllo di accesso
29Modificatori abstract
- Classi dichiarate abstract non possono essere
istanziate, e devono essere subclassate. - Metodi dichiarati abstract devono essere
sovrascritti - Una class non abstract non può contenere abstract
metods
30Modificatori visibilitÃ
- public visibile da tutti
- (non def.) visibile da tutti nello stesso package
- protected visibile dalle sottoclassi
- private nascosta da tutti
-
Uso di metodi di accesso
public class ACorrectClass private String
aUsefulString public String
getAUsefulString() return
aUsefulString // "get" the value
private void setAUsefulString(String s)
//protected void setAUsefulString(String s)
aUsefulString s // "set" the value
31Matrice degli accessi
Access Levels Access Levels Access Levels Access Levels Access Levels
Specifier Class Package Subclass World
private Y N N N
no specifier Y Y N N
protected Y Y Y N
public Y Y Y Y
Vedi anche http//java.sun.com/docs/books/tutoria
l/java/javaOO/accesscontrol.html
32Sezione Upcast - downcast
33Coercion
Una funzione può essere polimorfa senza essere
stata disegnata tale intenzionalmente. Sia f
una funzione che prende un argomento di tipo T, e
S sia un tipo che può essere automaticamente
convertito in T. Allora f può essere detta
polimorfa respetto a S e T. float somma(float x,
float y) accetta anche somma (3,
3.14) somma(2,3) (coercion di int a float)
34cast
- public class Test
- public static void main(String a)
- new Test()
-
Test() A a B b new B()
ab a.f1() a.f2()
OK upcast implicito
NO "method f2 not found in class A" (compiler)
class A void f1()
System.out.println("f1") class B extends A
void f2() System.out.println("f2") class
C extends B void f3() System.out.println("f3
")
35cast
- public class Test
- public static void main(String a)
- new Test()
-
Test() A a B b new B()
ab a.f1() ((B)a).f2()
OK upcast implicito
OK downcast corretto
class A void f1()
System.out.println("f1") class B extends A
void f2() System.out.println("f2") class
C extends B void f3() System.out.println("f3
")
36cast
- public class Test
- public static void main(String a)
- new Test()
-
Test() A a B b new B()
ab a.f1() ((C)a).f3()
OK upcast implicito
NO downcast illecito (runtime) java.lang.ClassCas
tException
class A void f1()
System.out.println("f1") class B extends A
void f2() System.out.println("f2") class
C extends B void f3() System.out.println("f3
")
37Type conversion - cast
- Si può applicare cast SOLO allinterno di una
- gerarchia di ereditarietÃ
- È consigliabile usare l'operatore instanceof per
verificare prima effettuare un downcast - if (staff1 instanceof Manager)
- Manager n (Manager)staff1
- ...