Hem E-böcker Specialeffekter och spelutveckling i Java Appleten FontEnlargerMenu  

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


}