java - JavaFX Calculator - How do I add a square and square root function? -


i making javafx calculator. trying develop square , square root function, i'm puzzled write in controller.java method. i'm not sure if they're working right, if click them return nothing. think, "okay, value stored?" attempt add 0 see if there's result, , errors.

app.java:

package com.honors.calc;  import javafx.application.application; import javafx.fxml.fxmlloader; import javafx.scene.parent; import javafx.scene.scene; import javafx.stage.stage;  public class app extends application {      @override     public void start(stage primarystage) throws exception {         parent root = fxmlloader.load(getclass().getresource("ui.fxml"));          primarystage.setscene(new scene(root));         primarystage.show();      }      public static void main(string[] args) {         launch(args);      }  } 

model.java:

package com.honors.calc;  public class model {      public long calculate(long number1, long number2, string operator) {         switch (operator) {             case "+":                 return number1 + number2;             case "-":                 return number1 - number2;             case "*":                 return number1 * number2;             case "/":                 if (number2 == 0)                     return 0;                  return number1 / number2;             case "c":                 number1 = 0;                 number2 = 0;                 return 0;             case "ce":                 number2 = 0;                 return 0;             case "x²":                 return number1 * number1;             case "√":                 return (long) math.sqrt(number1);         }         system.out.println("unknown operator - " + operator);         return 0;     } } 

controller.java:

package com.honors.calc;  import javafx.event.actionevent; import javafx.fxml.fxml; import javafx.scene.control.button; import javafx.scene.text.text;  public class controller {     @fxml     private text output;      private long number1 = 0;     private string operator = "";     private boolean start = true;      private model model = new model();      @fxml     private void processnumpad(actionevent event) {         if (start) {             // clear screen             output.settext("");             start = false;         }         string value = ((button)event.getsource()).gettext();         output.settext(output.gettext() + value);     }      @fxml     private void processoperator(actionevent event) {         string value = ((button)event.getsource()).gettext();          if(!"=".equals(value)) {             if (!operator.isempty())                 return;              operator = value;             number1 = long.parselong(output.gettext());             output.settext("");         } else {             // calculation             if (operator.isempty())                 return;              output.settext(string.valueof(model.calculate(number1, long.parselong(output.gettext()), operator)));             operator = "";             // reset             start = true;         }     }      @fxml     private void processclear(actionevent event) {         output.settext("0");     }      @fxml     private void processclearentry(actionevent event) {         output.settext("");     }      @fxml     private void processsquare(actionevent event) {       }      @fxml     private void processsquareroot(actionevent event) {      } } 

ui.fxml:

<?xml version="1.0" encoding="utf-8"?>  <?import java.net.*?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.beans.property.*?> <?import javafx.geometry.*?> <?import javafx.scene.shape.*?> <?import javafx.scene.control.*?> <?import javafx.scene.image.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.*?> <?import javafx.scene.paint.color?>  <vbox spacing="10" alignment="center" prefwidth="300" prefheight="320" fx:controller="com.honors.calc.controller" xmlns:fx="http://javafx.com/fxml">     <fx:define>         <font fx:id="font" size="18" />     </fx:define>      <stackpane alignment="center">         <rectangle fill="transparent" stroke="gray" width="230" height="50" />         <text fx:id="output" font="$font" />     </stackpane>      <hbox spacing="10" alignment="center">         <button text="c" prefwidth="50" font="$font" onaction="#processclear" />         <button text="ce" prefwidth="50" font="$font" onaction="#processclearentry" />         <button text="x²" prefwidth="50" font="$font" onaction="#processsquare" />         <button text="√" prefwidth="50" font="$font" onaction="#processsquareroot" />     </hbox>      <hbox spacing="10" alignment="center">         <button text="7" prefwidth="50" font="$font" onaction="#processnumpad" />         <button text="8" prefwidth="50" font="$font" onaction="#processnumpad" />         <button text="9" prefwidth="50" font="$font" onaction="#processnumpad" />         <button text="/" prefwidth="50" font="$font" onaction="#processoperator" />     </hbox>      <hbox spacing="10" alignment="center">         <button text="4" prefwidth="50" font="$font" onaction="#processnumpad" />         <button text="5" prefwidth="50" font="$font" onaction="#processnumpad" />         <button text="6" prefwidth="50" font="$font" onaction="#processnumpad" />         <button text="*" prefwidth="50" font="$font" onaction="#processoperator" />     </hbox>      <hbox spacing="10" alignment="center">         <button text="1" prefwidth="50" font="$font" onaction="#processnumpad" />         <button text="2" prefwidth="50" font="$font" onaction="#processnumpad" />         <button text="3" prefwidth="50" font="$font" onaction="#processnumpad" />         <button text="-" prefwidth="50" font="$font" onaction="#processoperator" />     </hbox>      <hbox spacing="10" alignment="center">         <button text="0" prefwidth="110" font="$font" onaction="#processnumpad" />         <button text="=" prefwidth="50" font="$font" onaction="#processoperator" />         <button text="+" prefwidth="50" font="$font" onaction="#processoperator" />     </hbox>  </vbox> 

your main issue stems un-handled numberformatexception here:

output.settext(string.valueof(model.calculate(number1, long.parselong(output.gettext()), operator))); 

as design requires equals initiate actual calculation, assumes second number present. recreate-able following input:

5 x² = (as second value isn't provided, empty string being parsed second value)

a quick fix replace line following:

        long number2 = 0;         try{             number2 = long.parselong(output.gettext());         }catch (numberformatexception nfe){             system.out.println("invalid value provided second value");         }         output.settext(string.valueof(model.calculate(number1, number2, operator))); 

and update fxml:

<button text="x²" prefwidth="50" font="$font" onaction="#processoperator" /> <button text="√" prefwidth="50" font="$font" onaction="#processoperator" /> 

this remove need these methods:

    @fxml     private void processsquare(actionevent event) {         }      @fxml     private void processsquareroot(actionevent event) {         } 

as if implement them, wouldn't able calculate values without improving underlying design operation , number(s) needed used within processoperator method


side note, recommend reading on shunting yard algorithm. used parse infix notation equations postfix equivalents allowing easy calculation. having used in past create custom scientific calculator, allow add additional functionality own calculator. main benefit implementation ability enter more complex equations additional operators.

even if don't end using it, it's interesting algorithm know / aware of