En EuroKalkylator (suck)
Provkör klassen
Tema:
- Panel
- Botton
- KlassArv
- Konverteringar
EuroCalcApplet.java
Skapa en fil med namnet EuroCalcApplet.java och sätt in följande kod:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class EuroCalcApplet extends Applet
{
// init måste alltid finnas i en Applet
public void init()
{
// för att få panelen att fylla ut helt sätter
// vi in den i mitten i en BorderLayout
this.setLayout( new BorderLayout( ) );
this.add( "Center", new EuroCalc( ) );
}
}
// en variant på en vanlig Button
class MyButton extends Button
{
// konstrueraren tar strängen för knappen, men även
// vem ssom skall meddelas om den blir tryckt på
public MyButton(String label, ActionListener who)
{
// använd förälderns konstruerare för att enklast få
// texten på knappen
super(label);
// eftersom vi hade fått ven som var intresserad av händelserna
// som parameter kan vi passa på att sätta addActionListener till
// denna
this.addActionListener( who );
// lite "lullLull" med färger och text
this.setBackground(new Color(255,255,192) );
this.setForeground(new Color(0,0,255));
this.setFont(new Font("SansSerif", Font.BOLD,16));
}
// en något modifierad setEnabled som används istället
// för Button klassens normala
public void setEnabled(boolean e)
{
// se till att ha "normal" setEnabled funktionalitet genom
// att använda förälderns motsvarande funktion
super.setEnabled (e);
// sätt grå färg om knappen är disablead
if ( e )
this.setBackground(new Color(255,255,192) );
else
this.setBackground(new Color(192,192,192) );
}
}
class EuroCalc extends Panel implements ActionListener
{
// vi använder oss av den modifierade knappen MyButton i
// stället för en vanlig Button.
// vi anger this som andra parameter så att knappen
// kan sätta sin addActionListener rätt
MyButton b0 = new MyButton("0", this);
MyButton b1 = new MyButton("1",this);
MyButton b2 = new MyButton("2",this);
MyButton b3 = new MyButton("3",this);
MyButton b4 = new MyButton("4",this);
MyButton b5 = new MyButton("5",this);
MyButton b6 = new MyButton("6",this);
MyButton b7 = new MyButton("7",this);
MyButton b8 = new MyButton("8",this);
MyButton b9 = new MyButton("9",this);
MyButton bP = new MyButton(".",this);
MyButton bC = new MyButton("C",this);
MyButton bFIM = new MyButton("FIM",this);
MyButton bEUR = new MyButton("EUR",this);
// textfield som skall visa siffrorna
TextField text = new TextField();
// Hit kommer vi när vi klickat på någon knapp
public void actionPerformed(ActionEvent e)
{
// Vi skapar en Button som vi sätter til
// det objekt som vi får med e.getSource()
// getSource() kommer dock att returnera ett objekt
// av typen Object och inte Button
// därför måste vi säga åt java att objektet skall
// betraktas som en Button genom att sätta (Button)
// i tilldelningen nedan
Button bb = (Button) e.getSource();
// vi vet nu vilken text det fans på den knapp som blev tryckt
String texten = bb.getLabel();
// jo jag vet nog att man skulle kunna använda
// String texten = e.getActionCommand()
// men jag ville så gärna visa casting
// har EUR knappen blivit tryckt
if ( texten == "EUR" )
{
// Skapa en Double med hjälp av den text som
// finns i TextFielden
Double d = new Double(text.getText());
// låt Double klassen ge oss en double som vi
// dividerar med 5.94573 för att få EUR värdet
// eftersom setText vill ha en String och inte en double
// som parameter "tvingar" vi resultatet till enn String
// genom att sätta "" + före
text.setText( "" + d.doubleValue() / 5.94573 );
}
else if ( texten == "FIM" )
{
// som EUR fast tvärsemot
Double d = new Double(text.getText());
text.setText( "" + d.doubleValue() * 5.94573 );
}
else if (texten == "C" )
{
// C knappen skall helt enkelt tömma texten
text.setText("");
// se till att "punktknappen" fungerar
bP.setEnabled(true);
}
else
{
// tag den text som fanns på knappen och sätt in den
// efter den text som redan fanns i TextFielden
text.setText(text.getText() + texten );
// om vi tryckte på "punktknappen" så ser vi till att vi
// inte kan slå flera punkter genom att "disabla" denna knapp
if ( texten == ".")
{
bP.setEnabled(false);
}
}
}
// konstrueraren
public EuroCalc()
{
// panelen bygger på en BorderLayout
BorderLayout border = new BorderLayout( );
// med en GridLayout med 5 rader och 3 kolumner i sig
GridLayout grid = new GridLayout( 5, 3 );
// sätter lite gap mellan knapparna
grid.setHgap(4);
grid.setVgap(6);
// och under texten
border.setVgap(4);
// se till att panelen har BorderLayout
this.setLayout( border );
// sätt in TextFielden längst upp
this.add("North", text );
// skapa en Panel som har vår GridLayout
Panel panel = new Panel( grid );
// lägg dit alla knappar - observera ordningsföljden
// de läggs dit med
panel.add(b7);
panel.add(b8);
panel.add(b9);
panel.add(b4);
panel.add(b5);
panel.add(b6);
panel.add(b1);
panel.add(b2);
panel.add(b3);
panel.add(b0);
panel.add(bP);
// måste få en tom cell i griden - sätt dit en tom Label
panel.add(new Label());
panel.add(bEUR);
panel.add(bFIM);
panel.add(bC);
// sätt sedan in den "griddade" panelen i mitten av
// vår BorderLayout
this.add("Center", panel);
// lite färgefixande
text.setForeground(new Color(0,0,255));
text.setBackground(new Color(255,255,77));
}
}