Įskiepių specifika. internetu iškviečiami įskiepiai dėl saugumo apribojimų negali:
DESCRIPTION
Įskiepių specifika. Internetu iškviečiami įskiepiai dėl saugumo apribojimų negali: 1. Nuskaityti ir įrašyti į bet kokį vartotojo disko failą ir nuskaityti failų katalogus 2. Komunikuoti su kitais serveriais išskyrus tik įskiepio savininką - serverį. 3. Paleisti jokio vykdomojo failo - PowerPoint PPT PresentationTRANSCRIPT
Įskiepių specifika.
Internetu iškviečiami įskiepiai dėl saugumoapribojimų negali:1. Nuskaityti ir įrašyti į bet kokį vartotojo disko failą ir nuskaityti failų katalogus2. Komunikuoti su kitais serveriais išskyrus tik įskiepio savininką - serverį.3. Paleisti jokio vykdomojo failo4. Pasinaudoti bet kokiais vartotojo kompiuterio platformos failais, pvz. DLL
Jei įskiepį paleidžiate su appletviever,galima nurodyti leidžiamus skaitymuiar rašymui katalogus; tai nurodoma.java.policy faile
Kad iškviesti greičiau reikalingus failus,galite pirma juos supakuoti, pvz:
> jar cf manoKlase.jar *.class ir panaudoti:
<applet code=manoKlase.class archive=manoKlase.jar width=200 height=100>
Kaip dirba įskiepiai
import java.applet.Applet; import java.awt.Graphics; public class HelloWorldApplet extends Applet { public void init() {
resize(250,250);} public void paint(Graphics g) {
g.drawString("Hello world!",25,25); } }
Java įskiepis daugiausiai reaguoja į įvykius:
Automatiškai kviečiami įskiepio metodai:1. init(); 2. start(); 3. paint(); 4. stop();
import java.applet.*;import java.awt.*; public class Count extends Applet {int InitCount=0, StartCount=0,StopCount=0, PaintCount=0;
public void init() { resize(250,75); InitCount ++; } public void start(){ StartCount++; }public void stop() { StopCount++; }public void paint(Graphics g) { PaintCount++; String Output = new String( "Inits: "+InitCount+ " Starts: "+StartCount+ " Stops: "+StopCount+ " Paints: "+paintCount);g.drawString(Output,25,25); } }
Iškvietus įskiepį rezultatas bus toks:Inits: 1 Starts: 1: Stops: 0 Paints 1
Metodas Aprašymasinit() Kviečiamas tik vieną kartą, pakraunant įsk.
start()Kviečiamas kiekvieną kartą, kai puslapis suįskiepiu yra aktyvuojamas.
stop()Iškviečiamas kiekvieną kartą, kai puslapissu įskiepiu tampa neaktyvus.
destroy() Iškviečiamas uždarant puslapį su įskiepiu.paint(Graphics g)
Kviečiamas kiekvieną kartą, kai įskiepiuireikia perpiešti jo grafinį langą
Automatinio iškvietimo taisyklės:
Įskiepis dėl saugumo apribojimų negali iškviestivartotojo kompiuterio duomenų failą, tačiau galiiškviesti garso ir vaizdo failus, turinčius URL !
URL patalpinti vaizdo ir garso resursamsiškviesti naudojama :
1. java.net.*; klasė
2. URL tikrinama try - catch bloku
3. Duomenys skaitomi lygiagrečiai su toliau
vykdoma Java programa
import java.applet.*; import java.awt.*; import java.net.*; public class WebApplet extends Applet {
private Image myImage; private AudioClip mySound; private URL ImageURL; private URL SoundURL;
public void init() { resize(250,250); try {
//Apibrėžiame resursusImageURL = new URL(getDocumentBase(),
"../images/sample.gif");SoundURL = new URL(getDocumentBase(),
"../sounds/sample.au"); }
//Apibrėžiame URL išimtįcatch (MalformedURLException e) {}//Nuskaitome vaizdąmyImage = getImage(ImageURL);//Nuskaitome vaizdąmySound = getAudioClip(SoundURL);
}
public void start() {//Grosime ciklu mySound.loop(); }
public void stop() {//Sustabdome grojimą mySound.stop(); }
public void paint(Graphics g){//Nupiešiame g.drawImage(myImage,0,0,this); }}
Vaizdo ir garso nuskaitymo ir panaud-o pvz:
Įvykių apdorojimas.Priklausomai nuo vartotojo veiksmo paleidžiamos įskiepio programos.Pvz:
public boolean mouseMove(Event evt, int x, int y) {
//Code here is run when the //mouse is moved
return true; //The event has //been handled
}
public boolean mouseDown(Event evt, int x, int y) {
//Code here is run when the //mouse key is pressed
down
return true; //The event has //been handled
}
ĮvykisJava 1.0
Įvykis Java1.1+
Aprašymas
mouseDown(Event,int,int)
processMouseEven(MouseEvent)
Paspaustas pelės mygtukas.Sveikieji skaičiai nurodo įvykiokoordinates.
mouseUp(Event,int,int)
processMouseEvent(MouseEvent)
Pelės mygtukas atlaisvintas.
mouseMove(Event,int,int)
processMouseMotionEvent(MouseEvent)
Pelė paslinkta.
mouseDrag(Event,int,int)
processMouseMotionEvent(MouseEvent)
Pelė paslinkta esant nuspaustammygtukui.
mouseEnter(Event,int,int)
processMouseEvent(MouseEvent)
Pelės žymeklis pateko į įskiepiosritį.
mouseExit(Event,int,int)
processMouseEvent(MouseEvent)
Pelės žymeklis išėjo iš įskiepiosrities.
keyDown(Event,int)
processKeyEvent(KeyEvent)
Nuspaustas klaviatūros arbafunkcinis klavišas. Sveikasisskaičius nurodo konkretųnuspaustą klavišą.
keyUp(Event,intt)
processKeyEvent(KeyEvent)
Atleistas klaviatūros arbafunkcinis klavišas.
Galimi įvykiai
import java.applet.*; import java.awt.*; import java.net.*;
public class CursorApplet extendsApplet {
//The position of the mouseprivate int mouse_x, mouse_y;//Do we want to follow the mouse?private boolean Follow = true;private Image CursorImage;
public void init() {mouse_x = 125;mouse_y = 125;resize(250,250);String CursorFile =
getParameter("CURSORFILE");try {
URL CursorURL = newURL(CursorFile);
CursorImage =getImage(CursorURL);
}catch (MalformedURLException e)
{CursorImage =
createImage(0,0);}
}
Interaktyvaus įskiepio pvz:
public void paint(Graphics g) {//A simple border
g.drawRect(0,0,249,249);//Draw cursor at the mouse's location
g.drawImage(CursorImage,mouse_x,mouse_y,this);}
public boolean mouseMove(Event evt, intx, int y) {if (Follow) {
//Update our local mouse informationmouse_x = x;mouse_y = y;//Redraw the graphics windowrepaint();
}return true;}
public boolean mouseDown(Event evt, intx, int y) {
//If it's not one thing...if (Follow) {Follow = false;}//It's anotherelse {Follow = true;}return true;
}}
Klaviatūros įvykiaiKlaviatūros mygtuko nuspaudimo apdorojimo pvz:
public boolean keyDown(Event evt, int key){
switch(key) {
case Event.UP:
case Event.DOWN:
case Event.LEFT:
case Event.RIGHT:
default:
} return true;
}
Galimi įvykio identifikatoriai:
UP DOWN LEFT RIGHT
PGUP PGDOWN
HOME END
F1-F12
Eventkintamasis
Aprašymas
publicObject target
Komponentė kur įvykis atsitiko. Įskiepio atveju taikomponente būna pats įskiepis.
public longwhen
Įvykio laika. "when" kintamajame rašomas long tiposveikasis skaičius nurodantis kiek praėjomilisekundžių nuo 00:00:00, 1970 sausio 1 d. Java turijava.lang.System.currentTimeMillis metodą, kurisgrąžina šią reikšmę.
public int id Įvykio tipas (žr. Įvykių tipų lentelę).public int x Įvykio x koordinatė.public int y Įvykio y koordinatė.public intkey
Įvykio identifikatorius.
public intmodifiers
Gretimų įvykių būsena.
publicObject arg
Sąlyginis argumentas. Jis nenaudojamas pelės irklaviatūros įvykių atveju ir rezervuotas ateičiai.
Įvykio (Event) klasės kintamieji
handleEvent metodo funkcija:
Įskiepio klasės hierarchija:
Object Java klasių hierarchijos viršūnė
Component
Klasė Aprašymas
Grafinis objektas ekrane galintis bendrauti su vartotoju
Container Grafinių objektų sritis. Yra add(),paint(Graphics), update (Graphics)
Panel Grafinių objektų išdėstymąapibrėžianti klasė (LayoutManager)
AppletJava kalba valdomų Interneto pus-lapiuose talpinamų įskiepių klasė
Window Paprastas grafinis langas be krašto
Frame Grafinis langas su pavadinimu ir kraštu
Dialog Grafinis langas naudojamasįvesti informacijai
public boolean handleEvent(Event e){ switch (e.id) { case Event.MOUSE MOUSE_DOWN: case Event.MOUSE MOUSE_MOVE: }}
handleEvent metodo perrašymas:
Dirbtinis įvykių generavimas:Event DirbtEvt;
long time = System.currentTimeMillis();
DirbtEvt = new Event(this,time,MOUSE_MOVE,
new_x,new_y,0,0,null);
postEvent(DirbtEvt);
Konstruktorius Parametrų aprašymasEvent(Object,long,in
t,int,int,int,int,Object)Paskirties komponentė, laikas, tipas, x,y koordinatė, identifikatorius,modifikatorius, argumentas.
Event(Object,long,int,int,int,int,int)
Paskirties komponentė, laikas, tipas, x,y koordinatė, identifikatorius,modifikatorius.
Event(Object,int,int,Object)
Paskirties komponentė, įvykio tipas, x koordinatė, argumentas.
Galimi įvykio konstruktoriai:
Animacija su įskiepiais
1. Animacijai reikia gijos
2. Kadangi klasė negali praplėsti kartu irįskiepio ir gijos, naudojamas interfeisas
Gijų metodai AprašymasisAlive() Grąžina loginę reikšmę ar gija įjungta.
sleep(long)Sustabdo giją long milisekundžių.Eina per išimtį InterruptedException,kuri gaunama kitai gijai ją pertaukus.
start() Paleidžia giją.stop() Sustabdo giją.suspend() Laikinai sustabdo giją.resume() Paleidžia laikinai sustabdytą giją.
Gijų metodai:
import java.applet.*; import java.awt.*; import java.net.*;public class AKursor extends Applet implements Runnable {private int mouse_x, mouse_y; private Image CursorImages[]; private int CursorIndex = 0; private Thread anim = null; private boolean paused = false; public void init() { resize(250,250); applet anim = new Thread(this); mouse_x = 125; mouse_y = 125;CursorImages = new Image[5]; int i; String CursorParam; URL CursorURL; for (i=0; i<5; i++) { CursorParam = getParameter("CURSORFILE"+i); try { CursorURL = new URL(CursorParam); CursorImages[i] = getImage(CursorURL); } catch (MalformedURLException e) {CursorImages[i] = createImage(0,0); } } } public void start() {start(); } //Start the run method anim. public void stop() { if (anim!=null && anim.isAlive()) anim.stop(); } public void paint(Graphics g) { int px, py; Image Cursor = CursorImages[CursorIndex]; g.drawRect(0,0,249,249); px = mouse_x - Cursor.getWidth(this)/2; py = mouse_y - Cursor.getHeight(this)/2;g.drawImage(Cursor,px,py,this); }
Animuoto kursoriaus įskiepis
public boolean mouseMove(Event evt, int x, int y) {
mouse_x = x; mouse_y = y;
return true; }
public boolean mouseDown(Event evt, int x, int y) {
//If paused, restart the run method
if (paused) { anim.resume(); paused = false; }
//Otherwise, pause the run method
else { anim.suspend(); paused = true; }
return true; }
public void run() {
while (anim!=null) {
try { //Suspend for 50 milliseconds
anim.sleep(50); }
catch (InterruptedException e) {}
//Move along to the next image
CursorIndex = CursorIndex + 1;
if (CursorIndex==5) {
//Start again at the beginning
CursorIndex = 0; }
repaint();
} } }
Įvykių apdorojimas:
Mirkčiojimo problemos sprendimas
Problemos priežastis, kad repaint() kviečia:
public void update(Graphics g) { g.setColor(getBackground()); g.fillRect(0, 0, width, height); g.setColor(getForeground()); paint(g);}
Paprastas sprendimas: perrašyti update():
public void update(Graphics g) {paint(g);
}
Kitas sprendimas - panaudojimas dvigubo buferio:
Animacijos pagerinimas:
private Image BuferImage;
private Graphics BuferGraphics;
public void init() {
resize(250,250);
Image = createImage(250,250);
BuferGraphics = BuferImage.getGraphics();… // ankstesnis kodas}public synchronized
void update(Graphics g) {
paint(BuferGraphics);
//Do applet painting to our canvas
g.drawImage(BuferImage,0,0,this);
//Paint the real graphics window
}
Pastabos:1. Dėl fono neperpiešimo judinantįskiepį gali atsirasti nenutrinti vaizdo pėdsakai2. Modernioje JApplet klasėje mirkčiojimo nėra