Specialeffekter och spelutveckling
i Java(TM) -Appleten FontEnlargerMenu
import java.applet.*;
import java.awt.*;
import java.net.*;
public class fontenlargermenu extends Applet {
//"maxitems" får hålla reda på hur
//många menyval som användaren har
//specifierat.
public int maxitems;
//Arrayerna "items", "descriptions" och
//"urls" kommer att användas för att
//lagra menyvalen, dess beskrivningar
//och adresserna.
public String items[],descriptions[],urls[];
public String target;
//Variablerna "normalfont" och
//"mouseoverfont" lagrar fonterna som
//kommer att användas när vi skriver
//ut menyvalen. Metricsvariablerna
//används för att mäta på dessa fonter.
//Variablerna "descriptionfont" och
//"descriptionmetrics" används för
//menyvalbeskrivningstexten.
public Font normalfont,mouseoverfont,descriptionfont;
public FontMetrics normalmetrics,mouseovermetrics;
public FontMetrics descriptionmetrics;
//Följande variabler har kopierats
//från ButtonMenu appleten. Vi behöver
//dem. Vi har också lagt till "textcolor"
//variabeln.
public Image bufferimage;
public Graphics bufferg;
public Color backgroundcolor,textcolor;
public Image backgroundimage=null;
public Dimension d;
//"currentitem" kommer att användas
//för att hålla reda på vilken
//menyval som precis har valts.
public int currentitem=0;
//Variabeln "displaydescription"
//indikerar om beskrivningstexten
//skall skrivas ut.
public boolean displaydescription=false;
public void init()
{
//while-slingan söker igenom hur många
//"item" parametrar det finns.
maxitems=0;
while (getParameter("item"+ maxitems)!=null) maxitems++;
items=new String[maxitems];
descriptions=new String[maxitems];
urls=new String[maxitems];
//Parametrarna för varje menyval läses
//in.
for (int i=0; i < maxitems; i++)
{
items[i]=getParameter("item"+i);
descriptions[i]=getParameter("description"+i);
urls[i]=getParameter("url"+i);
}
//bakgrundsfärgen och textfärgen läses in.
backgroundcolor=new Color(getIntegerParameter("backgroundcolor",16));
textcolor=new Color(getIntegerParameter("textcolor",16));
//Bakgrundsbilden läses in, det är bara att
//kopiera och klistra in raderna från TextScroller3.
MediaTracker tracker=new MediaTracker(this);
String backimage=getParameter("backgroundimage");
if (backimage!=null &&
(backimage.toUpperCase().indexOf("JPG") > -1 ||
backimage.toUpperCase().indexOf("GIF") > -1))
{
backgroundimage=getImage(getDocumentBase(),backimage);
tracker.addImage(backgroundimage,0);
try {tracker.waitForAll();}
catch(InterruptedException e) {}
}
//Bufferten initieras...
//Klistra in raderna
//från textscroller3 exemplet.
d=size();
bufferimage=createImage(d.width,d.height);
bufferg=bufferimage.getGraphics();
//Följande rader har kopierats från
//TextScroller3 appleten för att
//ta reda på om appletanvändaren
//vill ha fet eller kursiv stil
//på menytexten.
int fonttype=0;
if (getParameter("italic")!=null && getParameter("italic").substring(0,1).equalsIgnoreCase("y"))
fonttype+=Font.ITALIC;
if (getParameter("bold")!=null && getParameter("bold").substring(0,1).equalsIgnoreCase("y"))
fonttype+=Font.BOLD;
//Skapa menyvalfonterna med de parametrar som har
//specifierats. Observera att nu finns det två
//fontsizeparametrar, "normalfontsize" och "mouseroverfontsize".
normalfont=new Font(getParameter("font"),fonttype,getIntegerParameter("normalfontsize",10));
mouseoverfont=new Font(getParameter("font"),fonttype,getIntegerParameter("mouseoverfontsize",10));
//Initiera metricsvariablerna så att
//de kan användas för att mäta fonterna.
bufferg.setFont(normalfont);
normalmetrics=bufferg.getFontMetrics();
bufferg.setFont(mouseoverfont);
mouseovermetrics=bufferg.getFontMetrics();
//För descriptionfonten bestämmer vi
//storleken och typen.
descriptionfont=new Font("Helvetica",Font.PLAIN,12);
bufferg.setFont(descriptionfont);
descriptionmetrics=bufferg.getFontMetrics();
//Targetparametern laddas in...
target=getParameter("target");
}
public int getIntegerParameter(String name, int base)
{
String value=getParameter(name);
int intvalue;
try {intvalue=Integer.parseInt(value,base);}
catch (NumberFormatException e) {return 0;}
return intvalue;
}
public void paint(Graphics g)
{
if (bufferg!=null)
{
if (backgroundimage!=null)
{
bufferg.drawImage(backgroundimage,0,0,this);
}
else
{
bufferg.setColor(backgroundcolor);
bufferg.fillRect(0,0,d.width,d.height);
}
//Slingan ser till att alla menyval
//ritas ut.
for (int i=0; i< maxitems; i++)
{
bufferg.setColor(textcolor);
//If-satsen undersöker om besökaren
//pekar på menyvalet. Beroende på om
//han/hon gör det eller inte så
//används "mouseovermetrics" eller
//"normalmetrics" för att mäta på
//fonten.
if (currentitem==i)
{
//Följande rad används för att centrera
//menytexten horizontellt.
int dx=(d.width/maxitems-mouseovermetrics.stringWidth(items[i]))/2;
//Följande rad används för att centrera
//knappen vertikalt.
int dy=(d.height-mouseovermetrics.getHeight())/2;
//Besökaren pekar på den här meny-
//valet så därför använder vi
//mouseover fonten.
bufferg.setFont(mouseoverfont);
//Observera att eftersom menyn är en vertikal
//meny så ser vi till att det finns ett
//steg på (d.width/maxitems) innan nästa
//menyval skrivs ut.
bufferg.drawString(items[i],dx+i*d.width/maxitems,dy+mouseovermetrics.getAscent());
}
else
{
//Besökaren pekar INTE på den här meny-
//valet så därför använder vi
//normal fonten.
bufferg.setFont(normalfont);
int dx=(d.width/maxitems-normalmetrics.stringWidth(items[i]))/2;
int dy=(d.height-normalmetrics.getHeight())/2;
bufferg.drawString(items[i],dx+i*d.width/maxitems,dy+normalmetrics.getAscent());
}
}
//Om "displaydescription" är satt,
//så rita ut en beskrivningstext
//för menyvalet besökaren pekar på.
//Skriv ut texten längst ner
//på appletfönstret.
if (displaydescription)
{
bufferg.setColor(textcolor);
bufferg.setFont(descriptionfont);
bufferg.drawString(descriptions[currentitem]
,(d.width-descriptionmetrics.stringWidth(descriptions[currentitem]))/2
,d.height-2);
}
g.drawImage(bufferimage,0,0,this);
}
}
public void update(Graphics g) {paint(g);}
public boolean mouseMove(Event e, int x, int y)
{
//Här fungerar beräkningen av menyvalet
//nästan exakt som i ButtonMenu, fast vi
//använder "x" och "d.width" istället.
currentitem=x/(d.width/maxitems);
//"displaydescription" måste nu
//sättas så att beskrivningen för det
//valda menyvalet kommer upp.
displaydescription=true;
update(getGraphics());
return true;
}
public boolean mouseExit(Event e, int x, int y)
{
//"displaydescription" måste nu
//sättas till falsk.
displaydescription=false;
//Om användaren lämnar appletområdet
//så sätts "currentimage" till -1 så
//att ingen text ser ut att vara förstorad.
currentitem=-1;
update(getGraphics());
return true;
}
public boolean mouseDown(Event e, int x, int y)
{
gotoURL(urls[currentitem],target);
return true;
}
public void gotoURL(String address, String target)
{
URL link=null;
AppletContext appletcontrol=getAppletContext();
try {link=new URL(address);}
catch (MalformedURLException ex)
{
showStatus("FELSKRIVEN ADRESS."+address);
};
if (link!=null)
{
if (target!=null && target.length() > 0) appletcontrol.showDocument(link,target);
else appletcontrol.showDocument(link);
}
}
}
|
 |  |
|