package elte.java2_utikalauz5.applet; /** HTML böngészőprogram hipermédia képességeit szemléltető applet.

@link.forrásfájl {@docRoot}/../data/applet/src HipermediaTeszt.java @link.letöltés {@docRoot}/../data/applet HipermediaTeszt.jar @since Java Útikalauz programozóknak */ public class HipermediaTeszt extends java.applet.Applet implements Runnable, java.awt.event.MouseListener { /******** Mulitmédia anyagokat letöltő és tároló beágyazott osztály. **********/ class MediaTracker2 extends java.awt.MediaTracker { /** Verziószám. */ private final static long serialVersionUID = 15L; /** Alapértelmezett konstruktor */ public MediaTracker2() { super(HipermediaTeszt.this); //betöltés menetét az applet követi } /** Hanganyagok tárolója, kulcs a hangfájl relatív neve */ private java.util.HashMap zenék = new java.util.HashMap(); /** Hanganyag betöltése @param hangfájl a letöltendő hanganyag relatív címe a báziscímhez képest */ public void hangbetölt(final String hangfájl) { new Thread() { //háttérben saját programszálban public void run() { setPriority(MIN_PRIORITY); //senkit se zavarjunk showStatus("Hangbetöltés indul: "+hangok+hangfájl); try { java.net.URL cím = getClass().getResource(hangok+hangfájl); if (cím!=null) zenék.put( hangfájl, java.applet.Applet.newAudioClip(cím) ); } catch (Exception hiba) { showStatus("Hiba a letöltéskor: "+hangok+hangfájl); hiba.printStackTrace(); } }}.start(); } /** Hanganyag lejátszása @param hangfájl a lejátszandó hanganyag relatív címe a báziscímhez képest @param újra ismételt lejátszás kérése */ public void hangindít( String hangfájl, boolean újra ) { java.applet.AudioClip zene = zenék.get( hangfájl ); if (zene!=null) if (újra) zene.loop(); else zene.play(); } /** Hanganyag lejátszásának megállítása @param hangfájl a lejátszandó hanganyag relatív címe a báziscímhez képest */ public void hangleáll( String hangfájl ) { java.applet.AudioClip zene = zenék.get( hangfájl ); if (zene!=null) zene.stop(); } /** Képanyag lekérdezése @param képfájl a visszaadandó képanyag relatív címe a báziscímhez képest @return a kért képreprezentációs objektum */ public java.awt.Image getImage( String képfájl ) { //képerőforrás keresése java.net.URL cím = getClass().getResource(képek+képfájl); if (cím==null) return null; //nincs meg return HipermediaTeszt.this.getImage(cím); //képreprezentáció kérése } } /******************* Háttérképpel rendelkező nyomógomb ************************/ class KepesGomb extends java.awt.Button implements java.awt.event.KeyListener, java.awt.event.ActionListener, java.awt.event.MouseListener { /** Verziószám. */ private final static long serialVersionUID = 15L; /** Jelzi ha a gomb le van nyomva */ private boolean lenyomva; /** háttérkép */ java.awt.Image háttérkép; /** megjelenítendő hivatkozás */ java.net.URL hivatkozás; /** megjelenítés frame-je */ String frame; /** státuszsorban görgetendő szöveg */ String státuszsor; /** háttérzene fájlneve */ String háttérzene; /** kattintási zene fájlneve */ String kattintászene; /** képpuffer offscreen képhez */ java.awt.Image képpuffer; /** Képpuffer használatának jelzése */ @Override public boolean isDoubleBuffered() { return true; } /** Konstruktor @param kép a gomb háttérképe @param felirat a gomb felirata */ public KepesGomb(java.awt.Image kép, String felirat) { super(felirat); háttérkép = kép; addKeyListener(this); //lenyomás eseményfigyelése addMouseListener(this); addActionListener(this); requestFocus(); } /** Gomb optimális méretének lekérdezése. @return a gomb új optimális mérete */ @Override public java.awt.Dimension getPreferredSize() { //háttérkép mérete alapján if(háttérkép!=null&&háttérkép.getWidth(this)*háttérkép.getHeight(this)>0) return new java.awt.Dimension( háttérkép.getWidth(this)+10, háttérkép.getHeight(this)+10); return super.getPreferredSize(); } /** A növekményes megjelenítés nem támogatott. @param g A felhasználandó eredeti grafikus környezet. */ @Override public void update(java.awt.Graphics g) { paint(g); //mindig teljes megjelenítés } /** A gomb megjelenítésének elvégzése @param eredetig A felhasználandó eredeti grafikus környezet. */ @Override public void paint(java.awt.Graphics eredetig) { if (getWidth() * getHeight() ==0 ) return; //még nincs méretezve int x=0, y=0; if (képpuffer==null || getWidth()!=képpuffer.getWidth(this) || getHeight()!=képpuffer.getHeight(this)) képpuffer=createImage(getWidth(), getHeight()); java.awt.Graphics g=képpuffer.getGraphics(); //képpufferbe rajzolás if (hasFocus()) g.setColor(getForeground()); //aktuális köré keret else g.setColor(getBackground()); g.fillRect(0, 0, getWidth(), getHeight()); //háttér törlése g.setColor(getForeground()); if (lenyomva) x=y=1; g.draw3DRect(2, 2, getWidth()-5, getHeight()-5, !lenyomva); //gombkeret g.setColor(getBackground()); g.fill3DRect(3, 3, getWidth()-6, getHeight()-6, !lenyomva); if (háttérkép!=null) //háttérkép kirajzolása g.drawImage(háttérkép,x+3,y+3,getWidth()-6,getHeight()-6,this); if (getLabel()!=null) { //felirat középre rajzolása java.awt.FontMetrics fm=eredetig.getFontMetrics(); if (fm!=null) { g.setColor(getForeground()); x+=(getWidth()-fm.stringWidth(getLabel()))/2; y+=(getHeight()-fm.getHeight())/2+fm.getAscent(); g.drawString(getLabel(), x, y); } } eredetig.drawImage(képpuffer, 0, 0, null); //képpuffer kirajzolása g.dispose(); } /** Gombnyomás hatására beállított zene lejátszása. @param gombnyomás a gombnyomás eseményobjektuma */ public void actionPerformed( java.awt.event.ActionEvent gombnyomás ) { média.hangleáll(háttérzene); //háttérzene leáll média.hangindít(kattintászene, false); lenyomva=false; repaint(); if (hivatkozás!=null) //adott hivatkozás megjelenítése if (frame==null) getAppletContext().showDocument(hivatkozás); else getAppletContext().showDocument(hivatkozás, frame); } /** Billentyűlenyomás kezelése. @param billentyűesemény a fellépett esemény objektuma */ public void keyPressed(java.awt.event.KeyEvent billentyűesemény) { if ((billentyűesemény.getKeyCode()==java.awt.event.KeyEvent.VK_SPACE)) { lenyomva=true; repaint(); } } /** Billentyűfelengedés kezelése. @param billentyűesemény a fellépett esemény objektuma */ public void keyReleased(java.awt.event.KeyEvent billentyűesemény) {} /** Billentyűmegnyomás kezelése. @param billentyűesemény a fellépett esemény objektuma */ public void keyTyped(java.awt.event.KeyEvent billentyűesemény) {}; /** Egérkurzor belépésének kezelése. @param egéresemény a fellépett esemény objektuma */ public void mouseEntered(java.awt.event.MouseEvent egéresemény) { média.hangindít(háttérzene, true); //megadott háttérzene indítása görget(státuszsor); //státuszsorgörgetés indítása } /** Egérkurzor kilépésének kezelése. @param egéresemény a fellépett esemény objektuma */ public void mouseExited(java.awt.event.MouseEvent egéresemény) { média.hangleáll(háttérzene); //háttérzene leáll görget(null); //státuszsorgörgetés leállítása } /** Egérgomblenyomás kezelése. @param egéresemény a fellépett esemény objektuma */ public void mousePressed(java.awt.event.MouseEvent egéresemény) { if (!lenyomva) { lenyomva=true; requestFocus(); repaint(); } } /** Egérgombfelengedés kezelése. @param egéresemény a fellépett esemény objektuma */ public void mouseReleased(java.awt.event.MouseEvent egéresemény) { if (lenyomva) { lenyomva=false; repaint(); } } /** Egérgomblenyomás kezelése. @param egéresemény a fellépett esemény objektuma */ public void mouseClicked(java.awt.event.MouseEvent egéresemény) {}; }//***************************************************************************** /** Verziószám. */ private final static long serialVersionUID = 15L; /** képek báziscíme */ transient String képek; /** hangok báziscíme */ transient String hangok; /** médiakezelő */ transient MediaTracker2 média; /** applet háttérképe */ transient java.awt.Image háttérkép; /** háttér hanganyag fájlneve */ transient String háttérzene; /** státuszsor görgetésének késleltetése */ transient int görgetés; /** státuszsorban görgetendő teljes szöveg */ transient String státuszsor; /** pillanatnyi státuszszöveg */ private transient StringBuilder státuszszöveg = new StringBuilder(); /** Applet leírása @return Az applet leírása */ @Override public String getAppletInfo() { return "A böngészőprogram hipermédia képességeit szemléltető applet."; } /** Applet indítási paramétereinek leírása @return Az appletparaméterek leírása */ @Override public String[][] getParameterInfo() { String info[][]={ {"eloterszin", "szín", "alapértelmezett előtérszín"}, {"hatterszin", "szín", "alapértelmezett háttérszín"}, {"kepek", "relatív URL", "alapértelmezett báziscím a képekhez"}, {"hangok", "relatív URL", "alapértelmezett báziscím a hangokhoz"}, {"hatterkep", "képfájl", "háttérkép"}, {"hatterzene", "hangfájl", "háttérzene"}, {"gorgetes", "int", "görgetés várakozási ideje msec-ban"}, {"szovegX", "szöveg", "X. gomb felirata"}, {"kepX", "képfájl", "X. gomb képe"}, {"hatterzeneX", "hangfájl", "X. gomb háttérzenéje"}, {"kattintasX", "hangfájl", "X. gomb megnyomásakori zenéje"}, {"eloterszinX", "szín", "X. gomb előtérszíne"}, {"hatterszinX", "szín", "X. gomb háttérszíne"}, {"hivatkozasX", "URL", "X. gomb megjelenítendő hivatkozása"}, {"frameX", "frame neve", "X. gomb hivatkozási frame-je"}, {"statuszsorX", "szöveg", "X. gomb görgetett státuszszövege"} }; return info; } /** Színparaméter feldolgozása @param szín a színt reprezentáló szöveg @return a kért szín, vagy null, ha a paraméter helytelen */ java.awt.Color szín(String szín) { int c = 0; try { if (szín.startsWith("0x")) { //hexadecimálisan van megadva c = Integer.parseInt(szín.substring(2), 16); } else if (szín.startsWith("#")) { //hexadecimálisan van megadva c = Integer.parseInt(szín.substring(1), 16); } else if (szín.startsWith("0") && szín.length()>1) { //oktális c = Integer.parseInt(szín.substring(1), 8); } else c = Integer.parseInt(szín, 10); //decimálisan van megadva return new java.awt.Color( c ); } catch (NumberFormatException nfe) {} return null; } /** Applet inicializálása */ @Override public void init() { java.awt.Color szín; String param = getParameter("kepek"); //globális paraméterek átvétele képek = "/"+ (param==null ? "" : param+"/"); param = getParameter("hangok"); hangok = "/"+ (param==null ? "" : param+"/"); média = new MediaTracker2(); //médiaanyagok kezelőjének létrehozása if ((param=getParameter("hatterkep"))!=null) //háttérkép háttérkép = média.getImage(param); if ((param=getParameter("hatterszin"))!=null && //háttérszín ((szín=szín(param))!=null)) setBackground(szín); if ((param=getParameter("eloterszin"))!=null && //előtérszín ((szín=szín(param))!=null)) setForeground(szín); média.hangbetölt(háttérzene=getParameter("hatterzene")); //zenetöltés try { //görgetési sebesség görgetés=Integer.parseInt(getParameter("gorgetes")); } catch (Exception e) {} if (görgetés<100) görgetés=100; addMouseListener(this); //egérkurzor figyelése } /** háttérben történő paraméterfeldolgozás és szöveggörgetés programszála */ private transient Thread háttérszál; /** Applet indítása */ @Override public void start() { if (háttérszál==null) { //saját programszál indítása háttérszál = new Thread(this); háttérszál.setPriority(Thread.MIN_PRIORITY+1); háttérszál.start(); } } /** kezdeti paraméterfeldolgozás jelzése a háttérben */ private transient boolean indítás = true; /** következő feldolgozandó gomb sorszáma */ private transient int gombszámláló = 1; /** háttérben paraméterfeldolgozás és szöveggörgetés */ public void run() { if (indítás) { //indításkor paraméterfeldolgozás String felirat, képnév, param; while (((felirat=getParameter("szoveg"+gombszámláló))!=null) | ((képnév=getParameter("kep"+gombszámláló))!=null)) { java.awt.Image kép = null; if (képnév!=null) { //kép feldolgozása kép = média.getImage(képnév); if (kép!=null) média.addImage(kép, 1); } KepesGomb gomb=new KepesGomb(kép, felirat); //új gomb if ((param=getParameter("hivatkozas"+gombszámláló))!=null) try { gomb.hivatkozás = new java.net.URL(param); } catch (Exception e) { try { //talán relatív a hivatkozás gomb.hivatkozás=new java.net.URL(getDocumentBase(),param); } catch (Exception e2) { System.err.println("hivatkozas"+gombszámláló+e); } } gomb.frame=getParameter("frame"+gombszámláló); //frameX gomb.státuszsor=getParameter("statuszsor"+gombszámláló); gomb.háttérzene=getParameter("hatterzene"+gombszámláló); gomb.kattintászene=getParameter("kattintas"+gombszámláló); média.hangbetölt(gomb.háttérzene); //zenék betöltése média.hangbetölt(gomb.kattintászene); java.awt.Color szín=null; if ((param=getParameter("hatterszin"+gombszámláló))!=null) szín=szín(param); //hatterszinX if (szín==null) szín=getBackground(); gomb.setBackground(szín); szín=null; if ((param=getParameter("eloterszin"+gombszámláló))!=null) szín=szín(param); //eloterszinX if (szín==null) szín=getForeground(); gomb.setForeground(szín); add(gomb); validate(); gombszámláló++; //jöhet a következő gomb feldolgozása } indítás=false; //paraméterfeldolgozás befejezve try { média.waitForAll(); //képek betöltődését megvárni } catch (InterruptedException ie) { return; } invalidate(); //kész gombok újrarajzoltatása validate(); } státuszszöveg.setLength(0); while (Thread.currentThread()==háttérszál){//amíg aktuális a programszál synchronized(this) { //státuszszöveg miatti szinkronizálás if (státuszsor!=null) { //van mit görgetni if (státuszszöveg.length()==0) { //még nem görög státuszszöveg.ensureCapacity(státuszsor.length()); státuszszöveg.insert(0, státuszsor); } showStatus(státuszszöveg.toString()); //státuszsorba kiírás státuszszöveg = státuszszöveg.deleteCharAt( 0 ); //görgetés } } try { Thread.currentThread().sleep(görgetés); //várakozás } catch (InterruptedException ie) { return; } } } /** Applet megállítása */ @Override public void stop() { if (háttérszál!=null) háttérszál.interrupt(); //háttérszál megállítása háttérszál=null; } /** Új szöveg görgetése @param szöveg a görgetendő szöveg */ public synchronized void görget(String szöveg) { státuszsor=szöveg; if (státuszsor!=null && státuszsor.trim().length()==0) státuszsor=null; showStatus(""); státuszszöveg.setLength(0); } /** Nincs növekményes megjelenítés @param g A felhasználandó eredeti grafikus környezet. */ @Override public void update( java.awt.Graphics g ) { paint(g); } /** Háttérkép megjelenítése @param g A felhasználandó eredeti grafikus környezet. */ @Override public void paint( java.awt.Graphics g ) { if (háttérkép!=null) //csak ha van háttérkép g.drawImage(háttérkép, 0, 0, getWidth(), getHeight(), this); } /** Egérkurzor belépésének kezelése. @param egéresemény a fellépett esemény objektuma */ public void mouseEntered(java.awt.event.MouseEvent egéresemény) { média.hangindít(háttérzene, true); //megadott háttérzene indítása } /** Egérkurzor kilépésének kezelése. @param egéresemény a fellépett esemény objektuma */ public void mouseExited(java.awt.event.MouseEvent egéresemény) { média.hangleáll(háttérzene); //háttérzene leáll } /** Egérgomblenyomás kezelése. @param egéresemény a fellépett esemény objektuma */ public void mousePressed(java.awt.event.MouseEvent egéresemény) {} /** Egérgombfelengedés kezelése. @param egéresemény a fellépett esemény objektuma */ public void mouseReleased(java.awt.event.MouseEvent egéresemény) {} /** Egérgomblenyomás kezelése. @param egéresemény a fellépett esemény objektuma */ public void mouseClicked(java.awt.event.MouseEvent egéresemény) {}; }