chapter 10 event handling. chapter goals to understand the java event model to install mouse and...
Post on 19-Jan-2016
223 Views
Preview:
TRANSCRIPT
CHAPTER 10
EVENT HANDLING
CHAPTER GOALS
• To understand the Java event model
• To install mouse and action listeners
• To accept mouse and text input
• To display frame windows
• To show text output in a text area with a
scroll bar
Event Classes• Event source: Generates events and manages
listenersExample: applet
• Listener: Notified when event happensExample: MouseListener
• Event class: Describes eventExample: MouseEvent
The MouseListener Interface public interface MouseListener
{ void mousePressed(MouseEvent event); //Called when a mouse button has been pressed on a componentvoid mouseReleased(MouseEvent event); //Called when a mouse button has been released on a componentvoid mouseClicked(MouseEvent event); //Called when the mouse has been clicked on a componentvoid mouseEntered(MouseEvent event); //Called when the mouse enters a component void mouseExited(MouseEvent event); //Called when the mouse exits a component
}
File MouseSpy.java1 import java.awt.event.MouseEvent;
2 import java.awt.event.MouseListener;
3
4 /**
5 This listener simply prints out the listener method name
6 and the x- and y-coordinate of the mouse position.
7 */
8 public class MouseSpy implements MouseListener
9 {
10 public void mousePressed(MouseEvent event)
11 {
12 System.out.println("Mouse pressed. x = "
13 + event.getX() + " y = " + event.getY());
14 }
15
16 public void mouseReleased(MouseEvent event)
17 {
18 System.out.println("Mouse released. x = "
19 + event.getX() + " y = " + event.getY());
20 }
21
22 public void mouseClicked(MouseEvent event)
23 {
24 System.out.println("Mouse clicked. x = "
25 + event.getX() + " y = " + event.getY());
26 }
27
28 public void mouseEntered(MouseEvent event)
29 {
30 System.out.println("Mouse entered. x = "
31 + event.getX() + " y = " + event.getY());
32 }
33
34 public void mouseExited(MouseEvent event)
35 {
36 System.out.println("Mouse exited. x = "
37 + event.getX() + " y = " + event.getY());
38 }
39 }
File MouseSpyApplet.java1 import java.applet.Applet;
2
3 /**
4 This applet installs a mouse spy. Try generating the
5 five mouse event types by moving and clicking the mouse.
6 */
7 public class MouseSpyApplet extends Applet
8 {
9 public MouseSpyApplet()
10 {
11 MouseSpy listener = new MouseSpy();
12 addMouseListener(listener);
13 }
14 }
15
Spying on Mouse Events
Mouse Listener that Moves a Rectangle
public MouseApplet()
{ ... //add mouse press listener class MousePressListener implements MouseListener { public void mousePressed(MouseEvent event) {
int x = event.getX(); int y = event.getY(); box.setLocation(x,y); repaint();
}
//do-nothing methods public void mouseReleased(MouseEvent event){}
public void mouseClicked(MouseEvent event){}
public void mouseEntered(MouseEvent event){}
public void mouseExited(MouseEvent event){} } MouseListener listener = new MousePressListener(); addMouseListener(listener);
}
Mouse Listener that Moves a Rectangle
• Gets mouse position from event object • Accesses box instance field of outer class • Invokes repaint method on outer class • repaint triggers paint method • You should always call repaint to trigger painting
Don't call paint directly
The Mouse Applet
The Mouse Applet
An Applet with a Control Panel
Control Panel Components
• Use Swing package javax.swing • Class names start with J
• JTextField xField = new JTextField(width); • JLabel xLabel = new JLabel("x = "); • Icon buttonIcon = new ImageIcon("hand.gif");• moveButton = new JButton("Move",buttonIcon);
Button Listener• Moves rectangle when button is clicked • Reads xField, yField variables from enclosing scope public ButtonApplet() { ... class MoveButtonListener implements ActionListener { public void actionPerformed(ActionEvent event) { int x =Integer.parseInt(xField.getText()); int y =Integer.parseInt(yField.getText()); box.setLocation(x,y); repaint(); } }; ActionListener listener = new MoveButtonListener(); moveButton.addActionListener(listener); ... }
Placing Components in a Panel •JPanel is container for components • Add components to panelJPanel panel = new JPanel();panel.add(xLabel);panel.add(xField);. . .
• Place panel inside frameJFrame frame = new JFrame();frame.setContentPane(panel);
• Pack frame: size it to just contain the componentsframe.pack();frame.show();
File ButtonApplet.java 1 import java.applet.Applet;
2 import java.awt.Graphics;
3 import java.awt.Graphics2D;
4 import java.awt.Rectangle;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import javax.swing.ImageIcon;
8 import javax.swing.JButton;
9 import javax.swing.JFrame;
10 import javax.swing.JLabel;
11 import javax.swing.JPanel;
12 import javax.swing.JTextField;
13
14 /**
15 This applet lets the user move a rectangle by specifying
16 the x- and y-position of the top left corner.
17 */
18 public class ButtonApplet extends Applet
19 {
20 public ButtonApplet()
21 {
22 // the rectangle that the paint method draws
23 box = new Rectangle(BOX_X, BOX_Y,
24 BOX_WIDTH, BOX_HEIGHT);
25
26 // the text fields for entering the x- and y-coordinates
27 final JTextField xField = new JTextField(5);
28 final JTextField yField = new JTextField(5);;
29
30 // the button to move the rectangle
31 JButton moveButton = new JButton("Move",
32 new ImageIcon("hand.gif"));
33
34 class MoveButtonListener implements ActionListener
35 {
36 public void actionPerformed(ActionEvent event)
37 {
38 int x = Integer.parseInt(xField.getText());
39 int y = Integer.parseInt(yField.getText());
40 box.setLocation(x, y);
41 repaint();
42 }
43 };
44
45 ActionListener listener = new MoveButtonListener();
46 moveButton.addActionListener(listener);
47
48 // the labels for labeling the text fields
49 JLabel xLabel = new JLabel("x = ");
50 JLabel yLabel = new JLabel("y = ");
51
52 // the panel for holding the user interface components
53 JPanel panel = new JPanel();
54
55 panel.add(xLabel);
56 panel.add(xField);
57 panel.add(yLabel);
58 panel.add(yField);
59 panel.add(moveButton);
60
61 // the frame for holding the component panel
62 JFrame frame = new JFrame();
63 frame.setContentPane(panel);
64 frame.pack();
65 frame.show();
66 }
67
68 public void paint(Graphics g)
69 {
70 Graphics2D g2 = (Graphics2D)g;
71 g2.draw(box);
72 }
73
74 private Rectangle box;
75 private static final int BOX_X = 100;
76 private static final int BOX_Y = 100;
77 private static final int BOX_WIDTH = 20;
78 private static final int BOX_HEIGHT = 30;
79 }
Multiple Buttons with Similar Behavior
• Don't want to write separate code for similar listeners
• Remedy: Write method that attaches the listener
• Make variable parts into final method parameters • Local listener class can access final parameters
An Applet with Multiple Buttons
Method for Attaching Listenerpublic JButton makeButton(String label, final int dx,final int dy) { JButton button = new JButton(label); class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent event) { box.translate(dx, dy); repaint(); } };
ButtonListener listener = new ButtonListener(); button.addActionListener(listener); return button; }
Method for Attaching Listener
• Call multiple times
panel.add(makeButton("Left",-BOX_WIDTH,0)); panel.add(makeButton("Right",BOX_WIDTH,0)); panel.add(makeButton("Up",0,-BOX_HEIGHT)); panel.add(makeButton("Down",0,BOX_HEIGHT));
File ButtonApplet.java 1 import java.applet.Applet;
2 import java.awt.Graphics;
3 import java.awt.Graphics2D;
4 import java.awt.Rectangle;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import javax.swing.JButton;
8 import javax.swing.JFrame;
9 import javax.swing.JPanel;
10
11 /**
12 This applet lets the user move a rectangle by clicking
13 on buttons labeled "Left", "Right", "Up", and "Down".
14 */
15 public class ButtonApplet extends Applet
16 {
17 public ButtonApplet()
18 {
19 // the rectangle that the paint method draws
20 box = new Rectangle(BOX_X, BOX_Y,
21 BOX_WIDTH, BOX_HEIGHT);
22
23 // the panel for holding the user interface components
24 JPanel panel = new JPanel();
25
26 panel.add(makeButton("Left", -BOX_WIDTH, 0));
27 panel.add(makeButton("Right", BOX_WIDTH, 0));
28 panel.add(makeButton("Up", 0, -BOX_HEIGHT));
29 panel.add(makeButton("Down", 0, BOX_HEIGHT));
30
31 // the frame for holding the component panel
32 JFrame frame = new JFrame();
33 frame.setContentPane(panel);
34 frame.pack();
35 frame.show();
36 }
37
38 public void paint(Graphics g)
39 {
40 Graphics2D g2 = (Graphics2D)g;
41 g2.draw(box);
42 }
43
44 /**
45 Makes a button that moves the box.
46 @param label the label to show on the button
47 @param dx the amount by which to move the box in x-direction
48 when the button is clicked
49 @param dy the amount by which to move the box in y-direction
50 when the button is clicked
51 @return the button
52 */
53 public JButton makeButton(String label, final int dx,
54 final int dy)
55 {
56 JButton button = new JButton(label);
57
58 class ButtonListener implements ActionListener
59 {
60 public void actionPerformed(ActionEvent event)
61 {
62 box.translate(dx, dy);
63 repaint();
64 }
65 };
66
67 ButtonListener listener = new ButtonListener();
68 button.addActionListener(listener);
69 return button;
70 }
71
72 private Rectangle box;
73 private static final int BOX_X = 100;
74 private static final int BOX_Y = 100;
75 private static final int BOX_WIDTH = 20;
76 private static final int BOX_HEIGHT = 30;
77 }
Frame Windows• Application program, not applet
• Construct and show frameJFrame frame = new JFrame();. . .frame.show();
• Set the default close operationframe.setDefaultCloseOperation(EXIT_ON_CLOSE);
• Add components to a panel, then set the panel as content paneJPanel panel = new JPanel();panel.add(. . .);panel.add(. . .)frame.setContentPane(panel);
A Frame with Two Labels
File FrameTest.java1 import javax.swing.ImageIcon;
2 import javax.swing.JFrame;
3 import javax.swing.JLabel;
4 import javax.swing.JPanel;
5
6 /**
7 This program displays a frame with an image and a text label.
8 */
9 public class FrameTest
10 {
11 public static void main(String[] args)
12 {
13 JFrame frame = new JFrame();
14 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
15
16 JLabel iconLabel = new JLabel(new ImageIcon("world.gif"));
17 JLabel textLabel = new JLabel("Hello, World!");
18
19 JPanel panel = new JPanel();
20 panel.add(iconLabel);
21 panel.add(textLabel);
22 frame.setContentPane(panel);
23
24 frame.pack();
25 frame.show();
26 }
27 }
Text Components • JTextField holds a single line of text • JTextArea holds multiple lines
• Construct with new JTextArea(rows, columns)
• textArea.append(aString) appends text
• Use textArea.setEditable(false) to use for display only
• To add scroll bars, useJScrollPane scrollPane = new JScrollPane(textArea);
textArea.setContentPane(scrollPane);
A Text Area with Scroll Bars
The Control Panel for Adding Interest
File TextAreaTest.java1 import java.awt.event.ActionEvent;
2 import java.awt.event.ActionListener;
3 import javax.swing.JButton;
4 import javax.swing.JFrame;
5 import javax.swing.JLabel;
6 import javax.swing.JPanel;
7 import javax.swing.JScrollPane;
8 import javax.swing.JTextArea;
9 import javax.swing.JTextField;
10
11 /**
12 This program shows a frame with a text area that displays
13 the growth of an investment. A second frame holds a text
14 field to specify the interest rate.
15 */
16 public class TextAreaTest
17 {
18 public static void main(String[] args)
19 {
20 // the application adds interest to this bank account
21 final BankAccount account = new BankAccount(INITIAL_BALANCE);
22 // the text area for displaying the results
23 final JTextArea textArea = new JTextArea(10, 30);
24 textArea.setEditable(false);
25 JScrollPane scrollPane = new JScrollPane(textArea);
26
27 // construct the frame for displaying the text area
28 JFrame frame = new JFrame();
29 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
30 frame.setContentPane(scrollPane);
31 frame.pack();
32 frame.show();
33
34 // the label and text field for entering the interest rate
35 JLabel rateLabel = new JLabel("Interest Rate: ");
36
37 final JTextField rateField = new JTextField(10);
38 rateField.setText("" + DEFAULT_RATE);
39
40 // the button to trigger the calculation
41 JButton calculateButton = new JButton("Add Interest");
42
43 class CalculateListener implements ActionListener
44 {
45 public void actionPerformed(ActionEvent event)
46 {
47 double rate = Double.parseDouble(
48 rateField.getText());
49 double interest = account.getBalance()
50 * rate / 100;
51 account.deposit(interest);
52 textArea.append(account.getBalance() + "\n");
53 }
54 }
55
56 ActionListener listener = new CalculateListener();
57 calculateButton.addActionListener(listener);
58
59 // the control panel that holds the input components
60 JPanel controlPanel = new JPanel();
61 controlPanel.add(rateLabel);
62 controlPanel.add(rateField);
63 controlPanel.add(calculateButton);
64
65 // the frame to hold the control panel
66 JFrame controlFrame = new JFrame();
67 controlFrame.setContentPane(controlPanel);
68 controlFrame.pack();
69 controlFrame.show();
70 }
71
72 private static final double DEFAULT_RATE = 10;
73 private static final double INITIAL_BALANCE = 1000;
74 }
top related