180 likes | 279 Views
Į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
E N D
Į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 4. Pasinaudoti bet kokiais vartotojo kompiuterio platformos failais, pvz. DLL Jei įskiepį paleidžiate su appletviever, galima nurodyti leidžiamus skaitymui ar 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
Automatinio iškvietimo taisyklės: Įskiepis dėl saugumo apribojimų negali iškviesti vartotojo kompiuterio duomenų failą, tačiau gali iškviesti garso ir vaizdo failus, turinčius URL ! URL patalpinti vaizdo ir garso resursams iškviesti naudojama : 1. java.net.*; klasė 2. URL tikrinama try - catch bloku 3. Duomenys skaitomi lygiagrečiai su toliau vykdoma Java programa
Vaizdo ir garso nuskaitymo ir panaud-o pvz: 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 resursus ImageURL = 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); } }
Į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 }
Klaviatūros įvykiai Klaviatū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
Įvykio (Event) klasės kintamieji handleEvent metodo funkcija:
Įskiepio klasės hierarchija: Klasė Aprašymas Object Java klasių hierarchijos viršūnė Grafinis objektas ekrane galintis bendrauti su vartotoju Component Grafinių objektų sritis. Yra add(), paint(Graphics), update (Graphics) Container Grafinių objektų išdėstymą apibrėžianti klasė (LayoutManager) Panel Java kalba valdomų Interneto pus- lapiuose talpinamų įskiepių klasė Applet Paprastas grafinis langas be krašto Window Grafinis langas su pavadinimu ir kraštu Frame Grafinis langas naudojamas įvesti informacijai Dialog
handleEvent metodo perrašymas: public boolean handleEvent(Event e){ switch (e.id) { case Event.MOUSE MOUSE_DOWN: case Event.MOUSE MOUSE_MOVE: }} 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); 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:
Animuoto kursoriaus įskiepis 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); }
Įvykių apdorojimas: 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(); } } }
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ėdsakai 2. Modernioje JApplet klasėje mirkčiojimo nėra