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