java - danciu gabrieldanciugabriel.ro/assets/files/awt.pdfdelegation event model...
TRANSCRIPT
JavaCurs 8
Danciu GabrielDecembrie 2018
Applet - structura/*
<applet code="Demo" width=300 height=100>
</applet>
*/
public class Demo extends Applet {
// Called first.
public void init() {
// initialization
}
/* Called second, after init(). Also called whenever
the applet is restarted. */
public void start() {
// start or resume execution
}
// Called when the applet is stopped.
public void stop() {
// suspends execution
}
/* Called when applet is terminated. This is the last
method executed. */
public void destroy() {
// perform shutdown activities
}
// Called when an applet’s window must be restored.
public void paint(Graphics g) {
// redisplay contents of window
}
}
Applet
Exempluimport java.awt.*;
import java.applet.*;
/*
<applet code="Sample" width=300 height=50>
</applet>
*/
public class Demo extends Applet {
String msg;
// set the foreground and background colors.
public void init() {
this.setBackground(Color.cyan);
this.setForeground(Color.red);
msg = "Inside init( ) ->";
}
// Initialize the string to be displayed.
public void start() {
msg += " Inside start( ) ->";
}
// Display msg in applet window.
public void paint(Graphics g) {
msg += " Inside paint( ).";
g.drawString(msg, 10, 30);
}
}
Un bannerpackage demo;
import java.awt.*;
import java.applet.*;
/*
<applet code="SimpleBanner" width=300 height=50>
</applet>
*/
public class Demo extends Applet implements Runnable {
String msg = " A Simple Moving Banner.";
Thread t = null;
int state;
volatile boolean stopFlag;
// Set colors and initialize thread.
public void init() {
setBackground(Color.cyan);
setForeground(Color.red);
}
// Start thread
public void start() {
t = new Thread(this);
stopFlag = false;
t.start();
}
// Entry point for the thread that runs the banner.
public void run() {
// Redisplay banner
for (;;) {
try {
repaint();
Thread.sleep(250);
if (stopFlag)
break;
} catch (InterruptedException e) {}
}
}
// Pause the banner.
public void stop() {
stopFlag = true;
t.interrupt();
t = null;
}
// Display the banner.
public void paint(Graphics g) {
char ch;
ch = msg.charAt(0);
msg = msg.substring(1, msg.length());
msg += ch;
g.drawString(msg, 50, 30);
showStatus("This is shown in the status window.");
}
}
Evenimente
• Event – un obiect ce descrie o schimbare a stării sursei• Exemplu: ActionEvent
• Source – obiectul ce genrează evenimentul• Exemplu: un buton cu metoda addMouseListener(MouseListener e)
• Listener – un obiect care este notificat atunci când are loc un eveniment
• Exemplu: o clasa ce implementeaza interfata MouseMotionListener
Tipuri de evenimente
Surse de evenimente
Interfețe Listener
Delegation Event model
• Implementează interfața Listener corespunzătoare astfel ca ascultătorul să poată recepționa și trata evenimentul dorit.
• Implementează codul de abonare/dezabonare (după caz) astfel ca ascultătorul să poată primi notificări de la evenimentele corespunzătoare• Notă: o sursă poate genera mai multe tipuri de eveniment. Fiecare eveniment
trebuie înregistrat separat. De asemenea un obiect poate genera mai multetipuri de evenimente. De aceea, trebuie să implementeze acele interfețele Listener corespunzătoare evenimentelor care vor fi tratate.
Mouse Eventspackage demo;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*
<applet code="MouseEvents" width=300 height=100>
</applet>
*/
public class Demo extends Applet
implements MouseListener, MouseMotionListener {
String msg = "";
int mouseX = 0, mouseY = 0; // coordinates of mouse
public void init() {
addMouseListener(this);
addMouseMotionListener(this);
}
// Handle mouse clicked.
public void mouseClicked(MouseEvent me) {
// save coordinates
mouseX = 0;
mouseY = 10;
msg = "Mouse clicked.";
repaint();
}
// Handle mouse entered.
public void mouseEntered(MouseEvent me) {
// save coordinates
mouseX = 0;
mouseY = 10;
msg = "Mouse entered.";
repaint();
}
// Handle mouse exited.
public void mouseExited(MouseEvent me) {
// save coordinates
mouseX = 0;
mouseY = 10;
msg = "Mouse exited.";
repaint();
}
// Handle button pressed.
public void mousePressed(MouseEvent me) {
// save coordinates
mouseX = me.getX();
mouseY = me.getY();
msg = "Down";
repaint();
}
// Handle button released.
public void mouseReleased(MouseEvent me) {
// save coordinates
mouseX = me.getX();
mouseY = me.getY();
msg = "Up";
repaint();
}
// Handle mouse dragged.
public void mouseDragged(MouseEvent me) {
// save coordinates
mouseX = me.getX();
mouseY = me.getY();
msg = "*";
showStatus("Dragging mouse at " + mouseX + ", " + mouseY);
repaint();
}
// Handle mouse moved.
public void mouseMoved(MouseEvent me) {
// show status
showStatus("Moving mouse at " + me.getX() + ", " + me.getY());
}
// Display msg in applet window at current X,Y location.
public void paint(Graphics g) {
g.drawString(msg, mouseX, mouseY);
}
}
Keyboard Eventspackage demo;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*
<applet code="SimpleKey" width=300 height=100>
</applet>
*/
public class Demo extends Applet
implements KeyListener {
String msg = "";
int X = 10, Y = 20; // output coordinates
public void init() {
addKeyListener(this);
}
public void keyPressed(KeyEvent ke) {
showStatus("Key Down");
}
public void keyReleased(KeyEvent ke) {
showStatus("Key Up");
}
public void keyTyped(KeyEvent ke) {
msg += ke.getKeyChar();
repaint();
}
// Display keystrokes.
public void paint(Graphics g) {
g.drawString(msg, X, Y);
}
}
Keyboard Eventspackage demo;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*
<applet code="KeyEvents" width=300 height=100>
</applet>
*/
public class Demo extends Applet
implements KeyListener {
String msg = "";
int X = 10, Y = 20; // output coordinates
public void init() {
addKeyListener(this);
}
public void keyPressed(KeyEvent ke) {
showStatus("Key Down");
int key = ke.getKeyCode();
switch (key) {
case KeyEvent.VK_F1:
msg += "<F1>";
break;
case KeyEvent.VK_F2:
msg += "<F2>";
break;
case KeyEvent.VK_F3:
msg += "<F3>";
break;
case KeyEvent.VK_PAGE_DOWN:
msg += "<PgDn>";
break;
case KeyEvent.VK_PAGE_UP:
msg += "<PgUp>";
break;
case KeyEvent.VK_LEFT:
msg += "<Left Arrow>";
break;
case KeyEvent.VK_RIGHT:
msg += "<Right Arrow>";
break;
}
repaint();
}
public void keyReleased(KeyEvent ke) {
showStatus("Key Up");
}
public void keyTyped(KeyEvent ke) {
msg += ke.getKeyChar();
repaint();
}
// Display keystrokes.
public void paint(Graphics g) {
g.drawString(msg, X, Y);
}
}
Clase adapter
Demo - adapterpackage demo;
// Demonstrate an adapter.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*
<applet code="AdapterDemo" width=300 height=100>
</applet>
*/
public class Demo extends Applet {
public void init() {
addMouseListener(new MyMouseAdapter(this));
addMouseMotionListener(new MyMouseMotionAdapter(this));
}
}
class MyMouseAdapter extends MouseAdapter {
Demo adapterDemo;
public MyMouseAdapter(Demo adapterDemo) {
this.adapterDemo = adapterDemo;
}
// Handle mouse clicked.
public void mouseClicked(MouseEvent me) {
adapterDemo.showStatus("Mouse clicked");
}
}
class MyMouseMotionAdapter extends MouseMotionAdapter {
Demo adapterDemo;
public MyMouseMotionAdapter(Demo adapterDemo) {
this.adapterDemo = adapterDemo;
}
// Handle mouse dragged.
public void mouseDragged(MouseEvent me) {
adapterDemo.showStatus("Mouse dragged");
}
}
Clase adapter anonimepackage demo;
// Anonymous inner class demo.
import java.applet.*;
import java.awt.event.*;
/*
<applet code="AnonymousInnerClassDemo" width=200 height=100>
</applet>
*/
public class Demo extends Applet {
public void init() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
showStatus("Mouse Pressed");
}
});
}
}
AWT - Abstract Window Toolkit
AWT...
AWT – big picture
Framepackage demo;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*
<applet code="WindowEvents" width=300 height=50>
</applet>
*/
// Create a subclass of Frame.
class MyFrame extends Frame {
String msg = "";
int mouseX = 10, mouseY = 40;
MyFrame(String title) {
super(title);
// register this object to receive its own mouse events
MyMouseAdapter mouseadapter = newMyMouseAdapter(this);
addMouseListener(mouseadapter);
// create an object to handle window events
MyWindowAdapter adapter = newMyWindowAdapter(this);
// register it to receive those events
addWindowListener(adapter);
}
public void paint(Graphics g) {
g.drawString(msg, mouseX, mouseY);
}
}
class MyMouseAdapter extends MouseAdapter {
MyFrame sampleFrame;
public MyMouseAdapter(MyFrame sampleFrame) {
this.sampleFrame = sampleFrame;
}
@Override
public void mouseClicked(MouseEvent e) {
sampleFrame.mouseX = e.getX();
sampleFrame.mouseY = e.getY();
sampleFrame.msg = "Click";
sampleFrame.repaint();
}
}
class MyWindowAdapter extends WindowAdapter {
MyFrame sampleFrame;
public MyWindowAdapter(MyFrame sampleFrame) {
this.sampleFrame = sampleFrame;
}
public void windowClosing(WindowEvent we) {
sampleFrame.setVisible(false);
}
}
public class Demo {
public static void main(String[] args) {
MyFrame f = new MyFrame("Some title");
f.setVisible(true);
}
}
Drawingpackage demo;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*
<applet code="WindowEvents" width=300 height=50>
</applet>
*/
// Create a subclass of Frame.
class MyFrame extends Frame {
MyFrame(String title) {
super(title);
this.resize(500,800);
MyWindowAdapter adapter = newMyWindowAdapter(this);
// register it to receive those events
addWindowListener(adapter);
}
public void paint(Graphics g) {
g.drawLine(0, 0, 100, 90);
g.drawLine(0, 90, 100, 10);
g.drawLine(40, 25, 250, 80);
// Draw rectangles.
g.drawRect(10, 150, 60, 50);
g.fillRect(100, 150, 60, 50);
g.drawRoundRect(190, 150, 60, 50, 15, 15);
g.fillRoundRect(280, 150, 60, 50, 30, 40);
// Draw Ellipses and Circles
g.drawOval(10, 250, 50, 50);
g.fillOval(90, 250, 75, 50);
g.drawOval(190, 260, 100, 40);
// Draw Arcs
g.drawArc(10, 350, 70, 70, 0, 180);
g.fillArc(60, 350, 70, 70, 0, 75);
// Draw a polygon
int xpoints[] = {10, 200, 10, 200, 10};
int ypoints[] = {450, 450, 650, 650, 450};
int num = 5;
g.drawPolygon(xpoints, ypoints, num);
}
}
class MyWindowAdapter extends WindowAdapter {
MyFrame sampleFrame;
public MyWindowAdapter(MyFrame sampleFrame) {
this.sampleFrame = sampleFrame;
}
public void windowClosing(WindowEvent we) {
System.exit(0);
}
}
public class Demo {
public static void main(String[] args) {
MyFrame f = new MyFrame("Some title");
f.setVisible(true);
}
}
Resizingpackage demo;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*
<applet code="WindowEvents" width=300 height=50>
</applet>
*/
// Create a subclass of Frame.
class MyFrame extends Frame {
@Override
public void resize(int width, int height) {
repaint();
}
final int inc = 25;
int max = 500;
int min = 200;
Dimension d;
MyFrame(String title) {
super(title);
this.resize(500, 800);
MyWindowAdapter adapter = new MyWindowAdapter(this);
// register it to receive those events
addWindowListener(adapter);
addWindowStateListener(adapter);
addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
int w = (d.width + inc) > max ? min : (d.width + inc);
int h = (d.height + inc) > max ? min : (d.height + inc);
setSize(new Dimension(w, h));
}
});
}
public void paint(Graphics g) {
d = getSize();
g.drawLine(0, 0, d.width - 1, d.height - 1);
g.drawLine(0, d.height - 1, d.width - 1, 0);
g.drawRect(0, 0, d.width - 1, d.height - 1);
}
}
class MyWindowAdapter extends WindowAdapter {
@Override
public void windowStateChanged(WindowEvent e) {
sampleFrame.repaint();
}
MyFrame sampleFrame;
public MyWindowAdapter(MyFrame sampleFrame) {
this.sampleFrame = sampleFrame;
}
public void windowClosing(WindowEvent we) {
System.exit(0);
}
}
public class Demo {
public static void main(String[] args) {
MyFrame f = new MyFrame("Some title");
f.setVisible(true);
}
}
Fontspackage demo;
import java.applet.*;
import java.awt.*;
/*
<applet code="CenterText" width=200 height=100>
</applet>
*/
public class Demo extends Applet {
final Font f = new Font("SansSerif", Font.BOLD, 18);
public void paint(Graphics g) {
Dimension d = this.getSize();
g.setColor(Color.white);
g.fillRect(0, 0, d.width, d.height);
g.setColor(Color.black);
g.setFont(f);
drawCenteredString("This is centered.", d.width, d.height, g);
g.drawRect(0, 0, d.width - 1, d.height - 1);
}
public void drawCenteredString(String s, int w, int h,
Graphics g) {
FontMetrics fm = g.getFontMetrics();
int x = (w - fm.stringWidth(s)) / 2;
int y = (fm.getAscent() + (h -(fm.getAscent()
+ fm.getDescent())) / 2);
g.drawString(s, x, y);
}
}
Imagini/controalepackage demo;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.ImageObserver;
public class Demo extends Frame implements ImageObserver {
Image im;
Window w = new PopupWindow(this);
Demo() {
super("PopupButton Example");
im = getToolkit().getImage("1.png");
MediaTracker mt = new MediaTracker(this);
mt.addImage(im, 0);
Dimension d = new Dimension(400, 400);
this.resize(d);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
w.setLocation(e.getX(), e.getY());
w.setVisible(true);
}
}
});
this.show();
try {
mt.waitForAll();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
Frame f = new Demo();
}
public void paint(Graphics g) {
if (im != null) {
g.drawImage(im, 20, 20, this);
}
}
}
class PopupWindow extends Window {
PopupWindow(Frame f) {
super(f);
Panel p = new Panel();
p.add(new Button("About"));
p.add(new Button("Save"));
p.add(new Button("Quit"));
add("North", p);
setBackground(Color.gray);
pack();
}
public boolean action(Event e, Object o) {
if ("About".equals(o)) {
System.out.println("About");
} else if ("Save".equals(o)) {
System.out.println("Save Me");
} else if ("Quit".equals(o)) {
System.exit(0);
}
hide();
return true;
}
}
Exercitii
• Realizați desenarea unor linii sau trasarea unor puncte asemănător Paint
• Scrieti pe ecran o linie cu diferite caractere. La apasarea tastelor Ctrl+S linia se va salva intr-un fisier la alegere.
• Redimensionati o fereastra. La fiecare redimensionare se vor afisa noile dimensiuni la consola.
• Folosind ultimul exemplu, creati un pop-up menu cu trei butoane: ResetSave si Exit. Scrieti pe ecran o linie cu diferite caractere. Redimensionatifereastra. Pe butonul Reset textul devine “” iar dimensiunea devine300/300. Pe butonul de Save valorile vor fi salvate intr-un fisier. La incarcarea aplicatiei, fisierul va fi citit si aplicatia isi reia starea (text sidimensiune) de la ultimul Save.