import java.awt.*; import javax.swing.*; import java.awt.event.*; class Kalkulator { private JFrame kalkulator = new JFrame("Kalkulator"); private JLabel display = new JLabel("0.0"); private String opperasjon = ""; private boolean forrigeVarOpperasjon = false; private double forrigeTall = Double.NaN; // NaN st?r for Not-a-Number. Greit ? ha som default her. public Kalkulator() { try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) {System.exit(1);} kalkulator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); kalkulator.setLayout(new GridLayout(2, 1)); kalkulator.add(display); kalkulator.add(leggTilKnapper()); kalkulator.pack(); kalkulator.setVisible(true); } private JPanel leggTilKnapper() { JPanel knapper = new JPanel(); knapper.setLayout(new GridLayout(1, 2)); knapper.add(opprettTall()); knapper.add(opprettOpperasjonsknapper()); return knapper; } private JPanel opprettTall() { JPanel tall = new JPanel(); tall.setLayout(new GridLayout(4,3)); int t = 9; while (t > 0) { for (int j = t-2; j <= t; j++) { tall.add(new Tallknapp(j +"")); } t -= 3; } tall.add(new Tallknapp(".")); tall.add(new Tallknapp("0")); tall.add(new Opperasjonsknapp("C")); return tall; } private JPanel opprettOpperasjonsknapper() { JPanel knapper = new JPanel(); String[] tegn = {"+", "-", "*", "/", "="}; // Her kan man legge inn nye opperasjoner man vil ha med. knapper.setLayout(new GridLayout(tegn.length, 1)); for (String t : tegn) knapper.add(new Opperasjonsknapp(t)); // Oppretter knapper til alle opperasjonene. return knapper; } private void oppdaterDispaly(String t) { String tall = display.getText(); if (forrigeVarOpperasjon) { display.setText(t); forrigeTall = tall; } else if (tall.contains(".") && t.equals(".")); //Ikke gj?r noe, siden tallet allerede inneholder komma. else { if (tall.equals("0.0") && forrigeVarOpperasjon) display.setText(t); else display.setText(tall+t); } forrigeVarOpperasjon = false; // fjerner opperasjonsflagg. } private void oppdaterOpperasjon(String o) { if (o.equals("C")) { forrigeTall = Double.NaN; display.setText("0.0"); } opperasjon = o; } private double regnUt(double x, double y) { double sum = 0; System.out.println(opperasjon); switch (opperasjon) { case "+": sum = x + y; break; case "-": sum = x - y; break; case "*": sum = x * y; break; case "/": if (y == 0) sum = Double.NaN; // Man kan ikke dele p? 0. else { sum = x/y; } break; default: break; } return sum; } private class Opperasjonsknapp extends JButton { private final String opperasjon; public Opperasjonsknapp(String kode) { // Man kan sl?yfe this i metodekallene her, men jeg synes det er litt mer tydelig hva som foreg?r slik. opperasjon = kode; this.add(new JLabel(kode)); this.addActionListener(new OpperasjonsTrykk()); } private class OpperasjonsTrykk implements ActionListener { public void actionPerformed(ActionEvent e) { oppdaterOpperasjon(opperasjon); } } } private class Tallknapp extends JButton { private final String tall; public Tallknapp(String tall) { this.tall = tall; this.add(new JLabel(tall)); this.addActionListener(new Talltrykk()); } private class Talltrykk implements ActionListener { public void actionPerformed(ActionEvent e) { oppdaterDispaly(tall); } } } public static void main(String[] args) { Kalkulator c = new Kalkulator(); } }