/******************************************************** TL.java TaskuLaskin-sovelluksen applettiversio. Tekijä: Pekka Malmirae, 2/1999 ********************************************************/ import java.applet.*; import java.awt.*; import java.awt.event.*; /******************************************************* * Pääohjelma * *******************************************************/ public class TL extends Applet { public void init() { Taskulaskin laskin = new Taskulaskin(); laskin.addWindowListener(new SuljeIkkuna()); } } /******************************************************* * Taskulaskin-kehysluokka * *******************************************************/ class Taskulaskin extends Frame { char operaattori = 0; float nykyinen_arvo = 0; boolean puhdista_seuraava = false; Panel ylaosa_paneeli = new Panel(); Panel numero_paneeli = new Panel(); Panel funktio_paneeli = new Panel(); Button C_painike; Label naytto; Button numerot[] = new Button[10]; Button operaattorit[] = new Button[6]; public static final int JAKO = 0, KERTO = 1, MIINUS = 2, PLUS = 3, PISTE = 4, YHTEENSA = 5; public Taskulaskin() { super("TaskuLaskin"); setSize(170, 170); try { naytto = new Label("", Label.CENTER); naytto.setBackground(Color.yellow); C_painike = new Button("C"); C_painike.addActionListener(new NappaintenKuuntelija()); ylaosa_paneeli.setLayout(new GridLayout(1,2)); ylaosa_paneeli.add(naytto); ylaosa_paneeli.add(C_painike); numero_paneeli.setLayout(new GridLayout(4,3)); lisaa_numeronappaimet(numero_paneeli); funktio_paneeli.setLayout(new GridLayout(4,2)); lisaa_toimintonappaimet(funktio_paneeli); // Kootaan kaikki paneelit yhteen pohjaan. setLayout(new BorderLayout()); add(ylaosa_paneeli, "North"); add(funktio_paneeli, "East"); add(numero_paneeli, "Center"); setVisible(true); } catch (Exception poikkeus){ System.out.println("Virhe: " + poikkeus.toString() ); } } public void lisaa_numeronappaimet(Panel p) { // Lisätään luvut paneeliin 7-9, 4-6, 1-3, 0 int i; for (i=7; i<=9; i++) { numerot[i] = new Button((new String()).valueOf(i)); p.add(numerot[i]); numerot[i].addActionListener(new NappaintenKuuntelija()); } for (i=4; i<=6; i++) { numerot[i] = new Button((new String()).valueOf(i)); p.add(numerot[i]); numerot[i].addActionListener(new NappaintenKuuntelija()); } for (i=1; i<=3; i++) { numerot[i] = new Button((new String()).valueOf(i)); p.add(numerot[i]); numerot[i].addActionListener(new NappaintenKuuntelija()); } numerot[0] = new Button((new String()).valueOf(0)); p.add(numerot[0]); numerot[0].addActionListener(new NappaintenKuuntelija()); } public void lisaa_toimintonappaimet(Panel p) { operaattorit[JAKO] = new Button("/"); operaattorit[KERTO] = new Button("*"); operaattorit[MIINUS] = new Button("-"); operaattorit[PLUS] = new Button("+"); operaattorit[PISTE] = new Button("."); operaattorit[YHTEENSA] = new Button("="); // Lisätään laskentaoperaattorit paneeliin. p.add(operaattorit[JAKO]); p.add(operaattorit[KERTO]); p.add(operaattorit[MIINUS]); p.add(operaattorit[PLUS]); p.add(operaattorit[PISTE]); p.add(operaattorit[YHTEENSA]); // Lisätään tapahtumankuuntelijat toimintonäppäimille. for (int i=0; i<6; i++) operaattorit[i].addActionListener(new NappaintenKuuntelija()); // Tulospainike ei ole aluksi aktiivinen. operaattorit[YHTEENSA].setEnabled(false); } /* Lisätään laskimen painikkeille tapahtumankäsittelijät */ public class NappaintenKuuntelija implements ActionListener { public void actionPerformed(ActionEvent tapahtuma) { String painettu_nappain = tapahtuma.getActionCommand(); if (painettu_nappain.indexOf("+") != -1 || painettu_nappain.indexOf("-") != -1 || painettu_nappain.indexOf("*") != -1 || painettu_nappain.indexOf("/") != -1 ) { float arvo = palauta_arvo(); puhdista_naytto(); tulosta_nayttoon("" + arvo); } switch (painettu_nappain.charAt(0)) { case '+': case '-': case '*': case '/': vaihda_aktiivisia("YHTEENSA"); nykyinen_arvo = palauta_arvo(); operaattori = painettu_nappain.charAt(0); puhdista_seuraava = true; break; case '=': vaihda_aktiivisia("MUUT"); laske_tulos(); nykyinen_arvo = palauta_arvo(); operaattori = painettu_nappain.charAt(0); puhdista_seuraava = true; break; case 'C': puhdista_naytto(); operaattori = 0; nykyinen_arvo = 0; break; default: if (puhdista_seuraava) { puhdista_naytto(); puhdista_seuraava = false; } tulosta_nayttoon(painettu_nappain); } } public void laske_tulos() { float vanha_arvo = palauta_arvo(); switch (operaattori) { case '+': nykyinen_arvo += vanha_arvo; break; case '-': nykyinen_arvo -= vanha_arvo; break; case '*': nykyinen_arvo *= vanha_arvo; break; case '/': if (nykyinen_arvo != 0) nykyinen_arvo /= vanha_arvo; else nykyinen_arvo = 0; break; } puhdista_naytto(); tulosta_nayttoon("" + nykyinen_arvo); puhdista_seuraava = true; } public void tulosta_nayttoon(String painettu_nappain) { String naytto_teksti = naytto.getText(); if (painettu_nappain.charAt(0) == '.') { if (naytto_teksti.indexOf(".") == -1) naytto_teksti += "."; } else naytto_teksti += painettu_nappain; naytto.setText(naytto_teksti); } private void vaihda_aktiivisia(String mj) { if (mj.equals("YHTEENSA")) { operaattorit[YHTEENSA].setEnabled(true); operaattorit[JAKO].setEnabled(false); operaattorit[KERTO].setEnabled(false); operaattorit[MIINUS].setEnabled(false); operaattorit[PLUS].setEnabled(false); } else { operaattorit[YHTEENSA].setEnabled(false); operaattorit[JAKO].setEnabled(true); operaattorit[KERTO].setEnabled(true); operaattorit[MIINUS].setEnabled(true); operaattorit[PLUS].setEnabled(true); } } private void puhdista_naytto() { naytto.setText(""); } private float palauta_arvo() { String mj = naytto.getText(); return (Float.valueOf(mj)).floatValue(); } } } /****************************************************** * SuljeIkkuna-luokka * * Luokka hoitaa ikkunan sulkemisen. *******************************************************/ class SuljeIkkuna extends WindowAdapter { public void windowClosing(WindowEvent tapahtuma) { Window ikkuna = tapahtuma.getWindow(); ikkuna.dispose(); } }