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) {};
}