Inner Classes - PowerPoint PPT Presentation

1 / 41
About This Presentation
Title:

Inner Classes

Description:

class App // centra la finestra nello schermo ... public class Applicazione ... Font fb = new Font('TimesRoman', Font.BOLD, 18) ... – PowerPoint PPT presentation

Number of Views:70
Avg rating:3.0/5.0
Slides: 42
Provided by: latemarSc
Category:
Tags: class | classes | inner

less

Transcript and Presenter's Notes

Title: Inner Classes


1
Inner Classes
  • Ancora eventi

2
Design 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.

3
Low-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.

4
Listeners/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...

5
Listeners/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
  • ...

6
Inner 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...

7
Anonymous 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...
  • )

8
Inner 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.

9
Anonymous 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...
  • )
  • ...

10
Listeners 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.

11
Altri listeners
  • action
  • caret
  • change
  • documentundoable edit
  • item
  • listselection
  • window
  • Listeners speciali per componenti specifiche
    (treeNodeExpansion, ecc)

12
Layouts and Graphics
13
component - container - layout
Un Container contiene 0 o Components Il
Layout specifica come i Components sono disposti
nel Container Un Container è un Component (quindi
il contenimento è ricorsivo) Un Component ha una
Graphics associata
14
Layouts
  • Gestione
  • del
  • Layout
  • Vedi anche
  • http//java.sun.com/docs/books/tutorial/uiswing/la
    yout/index.html

15
Layouts
16
Layouts
17
Layouts
18
Layouts
http//java.sun.com/docs/books/tutorial/uiswing/la
yout/spring.html
19
class YellowWindow
package it.unitn.science.prog2.guiApp import
java.awt. import javax.swing. public class
YellowWindow extends JFrame private JPanel
contentPane public YellowWindow() try
jbInit() catch(Exception e)
e.printStackTrace() private void
jbInit() throws Exception
contentPane(JPanel)this.getContentPane()
this.setSize(new Dimension(400, 300))
contentPane.setBackground(Color.YELLOW)

20
class App
package it.unitn.science.prog2.guiApp import
javax.swing. import java.awt. public class
App JFrame finestranull public static
void main(String a) new App() public
App() // aggiungere qui set lookfeel
(vedi oltre) this.setupGraphicEnvironment()

21
class App
private void setupGraphicEnvironment()
finestra new YellowWindow() //new MyWindow
// trova le dimensioni dello schermo e della
finestra Dimension screenSize
Toolkit.getDefaultToolkit().getScreenSize()
Dimension frameSize finestra.getSize()
// assicurati che la finestra non sia più grande
dello schermo if (frameSize.height gt
screenSize.height) frameSize.height
screenSize.height if (frameSize.width gt
screenSize.width) frameSize.width
screenSize.width

22
class App
// centra la finestra nello schermo
finestra.setLocation((screenSize.width -
frameSize.width) / 2, (screenSize.height -
frameSize.height) / 2) // fai in modo che
la chiusura della finestra // termini
l'applicazione finestra.setDefaultCloseOperati
on(JFrame.EXIT_ON_CLOSE ) // rendi la
finestra visibile finestra.setVisible(true)

23
BorderLayout
In YellowWindow cambio il metodo jbInit
private void jbInit() throws Exception
JPanel f(JPanel)this.getContentPane()
JButton north, south, east, west, center
north new JButton("North") east new
JButton("East") west new JButton("West")
center new JButton("Center") south
new JButton("South") f.setLayout(new
BorderLayout(2, 2)) f.add(north,
BorderLayout.NORTH) f.add(south,
BorderLayout.SOUTH) f.add(east,
BorderLayout.EAST) f.add(west,
BorderLayout.WEST) f.add(center,
BorderLayout.CENTER) this.setSize(300,300)

24
FlowLayout
In YellowWindow cambio il metodo jbInit
private void jbInit() throws Exception
JPanel f(JPanel)this.getContentPane()
JButton one, two, three, four, five, six one
new JButton("one") two new
JButton("two") three new
JButton("three") four new
JButton("four") five new JButton("five")
six new JButton("six") f.setLayout(new
FlowLayout()) f.add(one) f.add(six)
f.add(five) // attenzione allordine!
f.add(two) f.add(three) f.add(four) //
aggiungo five per la seconda volta - la prima
viene eliminata ! f.add(five)
this.setSize(300,300)

25
BorderLayout
In YellowWindow cambio il metodo jbInit
private void jbInit() throws Exception
JPanel f(JPanel)this.getContentPane()
f.setLayout(new GridLayout(3,4)) JButton
bnew JButton10 // VETTORE DI 10 BOTTON
for (int k0 klt10 k) bknew
JButton() // Integer.toString(int a)
traduce lintero a in una String
bk.setLabel(Integer.toString(k))
f.add(bk) this.setSize(300,300)

26
BorderLayout
In YellowWindow cambio il metodo jbInit
private void jbInit() throws Exception
JPanel f(JPanel)this.getContentPane()
CardLayout clnew CardLayout()
f.setLayout(cl) JPanel p new JPanel5
Color c Color.red,Color.orange,Color.green,C
olor.blue,Color.pink for (int k0klt5
k) pknew JPanel()
pk.setBackground(ck)
f.add(Integer.toString(k),pk) // il primo
parametro è una stringa con la quale riferirsi al
componente aggiunto
this.setSize(300,300) this.setVisible(tru
e) while (true) // ciclo infinito
try Thread.sleep(800) //
dormi per 500 millisecondi catch
(Exception e) cl.next(f) //
richiama il prossimo componente

27
Posizionamento assoluto Null Layout
  • It's possible to set the layout manager to null
    no layout control. You might do this to position
    an object on the display at some absolute
    coordinates. This is almost never the right
    approach. Components might have different minimum
    sizes on different platforms, and your interface
    would not be very portable.
  • import java.awt.
  • public class Applicazione
  • public static void main(String s)
    Applicazione anew Applicazione()
  • Applicazione()
  • JFrame g new JFrame ("Finestra controllata
    da BORDER Layout")
  • JPanel f(JPanel)(g.getContentFrame()
  • f.setSize(200,200) // Dimensione della
    finestra
  • f.setLocation(50,100) // Posizione della
    finestra
  • JButton bnew JButton(("Push me")
  • f.setLayout(null)
  • f.add(b)
  • b.setSize(25,75) // Dimensiono il Bottone
  • b.setLocation(10,100) // Posiziono il
    bottone nella finestra
  • g.setVisible(true)

28
Custom Painting
  • Gestione
  • della
  • Grafica customizzata
  • Vedi anche
  • http//java.sun.com/docs/books/tutorial/uiswing/14
    painting/index.html

29
Metodi grafici di Graphics
  • drawLine() Draws a line
  • drawRect() Draws a rectangle
  • fillRect() Draws a filled rectangle
  • drawRoundRect() Draws a rounded-corner rectangle
  • fillRoundRect() Draws a filled, rounded-corner
    rectangle
  • draw3DRect() Draws a highlighted, 3D rectangle
  • fill3DRect() Draws a filled, highlighted, 3D
    rectangle
  • drawArc() Draws an arc
  • fillArc() Draws a filled arc
  • drawOval() Draws an oval
  • fillOval() Draws a filled oval
  • drawPolygon() Draws a polygon, connecting
    endpoints
  • fillPolygon() Draws a filled polygon
  • drawPolyline() Draws a line connecting a
    polygon's points

30
Il sistema di coordinate
31
Disegno Grafico
import java.awt. import javax.swing. import
java.awt.event. public class TestPattern
public static void
main(String args) new TestPattern()
public TestPattern()
startGraphics() public void
startGraphics() JFrame f new
JFrame("TestPattern") f.setSize(300,300)
f.setContentPane(new MyPanel())
f.setVisible(true)
32
Disegno Grafico
class MyPanel extends JPanel int theta 45
int delta 90 public void paintComponent(Graph
ics g) super.paintComponent(g) int
width getSize().width int height
getSize().height int hWidth width / 2
int hHeight height / 2 int x (width -
hWidth)/2 int y (height - hHeight)/2
g.setColor(Color.black) g.fillRect(0, 0,
size().width, size().height) int polyx
0, width / 2, width, width / 2 int polyy
height / 2, 0, height / 2, height
Polygon poly new Polygon(polyx, polyy, 4)
g.setColor(Color.yellow) g.fillPolygon(poly)
g.setColor(Color.red) g.fillRect(x, y,
hWidth, hHeight) g.setColor(Color.green)
g.fillOval(x, y, hWidth, hHeight)
g.setColor(Color.blue) g.fillArc(x, y,
hWidth, hHeight, theta, delta)
g.setColor(Color.white) g.drawLine(x, y, x
hWidth, x hHeight)
33
Animazione
Click!
Click!
Click!
34
Animazione
class MyPanel extends JPanel implements
MouseListener int theta 45 int delta
90 public void paintComponent(Graphics g)
... public void mouseClicked(MouseEvent
e) thetatheta-90 this.repaint()
public void mouseEntered(MouseEvent e)
public void mouseExited(MouseEvent e)
public void mousePressed(MouseEvent e)
public void mouseReleased(MouseEvent e)
MyPanel() this.addMouseListener(this)
Double buffering dietro le quinte!
35
Repainting
NON SI CHIAMA MAI ESPLICITAMENTE LA
paintComponent(Graphics g)! nè la
paint(Graphics g) Si chiama sempre, solo la
repaint() NON SI IMPLEMENTA MAI LA REPAINT! La
repaint viene chiamata anche dal sistema quando
lo ritiene opportuno (resize, unhide...)
36
Colore
class MyPanel extends JPanel implements
MouseListener public void paintComponent(Graphi
cs g) super.paintComponent(g) int
rval, gval, bval for (int j 30 j lt
(this.size().height -25) j 30) for
(int i 5 i lt (this.size().width -25) i 30)
rval (int)Math.floor(Math.random()
256) gval (int)Math.floor(Math.random()
256) bval (int)Math.floor(Math.rando
m() 256) g.setColor(new
Color(rval,gval,bval))
g.fillRect(i,j,25,25) g.setColor(Color.bl
ack) g.drawRect(i-1,j-1,25,25)
...
Double buffering dietro le quinte!
37
Animazione
Click!
Resize!
38
Insets
protected void paintComponent(Graphics g)
... Insets insets getInsets() int
currentWidth getWidth() - insets.left -
insets.right int currentHeight
getHeight() - insets.top - insets.bottom
... / First painting occurs at (x,y), where x is
at least insets.left, and y is at least
insets.top. /...
39
Come avviene il painting
1. background (if opaque) 2. custom painting (if any) 3. border (if any) 4. children (if any)
                                                                                                                       
paintComponent The main method for painting.
By default, it
first paints the background if
the component is opaque.
Then it performs any
custom painting. paintBorder Tells the
component's border (if any) to paint.
Do not invoke or override this
method. paintChildren Tells any components
contained by this
component to paint themselves.
Do not invoke or override this method.
40
Regole
  • When implementing custom painting code for a
    component,
  • keep these rules in mind
  • Your custom painting code should be in a method
    with the signature protected void
    paintComponent(Graphics).
  • To gain access to the power of the 2D graphics
    API , you can cast the Graphics parameter into a
    Graphics2D object.
  • You can use a border to paint the outside edges
    of your component.
  • Except when painting the background of the
    component, you should avoid painting over the
    border area of the component. You can determine
    this area using the getInsets method.
  • Your component must honor the opaque property. If
    your component is opaque, it must paint its
    complete area using an opaque color or colors. If
    its opaque property is false, then you have the
    option of not painting over the entire component.

41
Fonts
class MyPanel extends JPanel public void
paintComponent(Graphics g)
super.paintComponent(g) Font f new
Font("TimesRoman", Font.PLAIN, 18)
FontMetrics fm getFontMetrics(f)
g.setFont(f) String s "This is a plain
font" int xstart (getSize().width
fm.stringWidth(s))/2 g.drawString(s,
xstart, 25) Font fb new Font("TimesRoman",
Font.BOLD, 18) Font fi new
Font("TimesRoman", Font.ITALIC, 18) Font
fbinew Font("TimesRoman",Font.BOLD Font.ITALIC,
18) g.setFont(fb) g.drawString("This is a
bold font", 10, 50) g.setFont(fi)
g.drawString("This is an italic font", 10, 75)
g.setFont(fbi) g.drawString("This is a bold
italic font", 10, 100) ...
Write a Comment
User Comments (0)
About PowerShow.com