Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Project: Calculator


import scala.swing.*
import scala.swing.event.*

@main
def calculator(): Unit = {
  var display = ""

  new MainFrame() {
    title = "Calculator"

    val label = new Label()
    label.preferredSize = new Dimension(200, 30)
    label.xAlignment = Alignment.Left
    label.font = Font("Arial", Font.Plain, 18)
    
    val buttonGrid = new GridPanel(4, 4)

    val labels = List(
      "7", "8", "9", "/",
      "4", "5", "6", "*",
      "1", "2", "3", "+",
      "C", "0", "=", "-")

    val buttons = labels.foreach(l => {
      val b = new Button(l)
      b.reactions.+= {
        case ButtonClicked(e) => click(e)
      }
      buttonGrid.contents += b
    }
    )
    contents = new BorderPanel {
      add(label, BorderPanel.Position.North)
      add(buttonGrid, BorderPanel.Position.Center)
    }

    var num1 = 0
    var operator = ""

    def click(but: AbstractButton): Unit = {
      println(but.text)

      but.text match {
        case "7" | "8" | "9" | "4" | "5" | "6" | "1" | "2" | "3" | "0" =>
          println("number")
          label.text += but.text

        case "*" | "/" | "+" | "-" =>
          println("operator")
          operator = but.text
          num1 = label.text.toInt
          label.text = ""

        case "=" => calculate()

        case _ => println("error")
      }
    }

    def calculate(): Unit = {
      val num2 = label.text.toInt
      val result = operator match {
        case "+" => num1 + num2
        case "-" => num1 - num2
        case "*" => num1 * num2
        case "/" => num1 / num2
      }
      label.text = result.toString
    }

    size = new Dimension(300, 300)
    centerOnScreen()
    open()
  }
}