diff --git a/.idea/misc.xml b/.idea/misc.xml index ecfa09c..b173c63 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/pom.xml b/pom.xml index ff617e7..6ebe25c 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,11 @@ ${junit.version} test + + net.objecthunter + exp4j + 0.4.8 + diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 7c33463..0085150 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -1,6 +1,7 @@ module net.marakaner.calc { requires javafx.controls; requires javafx.fxml; + requires exp4j; opens net.marakaner.calc to javafx.fxml; diff --git a/src/main/java/net/marakaner/calc/CalcController.java b/src/main/java/net/marakaner/calc/CalcController.java index 3542797..58531ee 100644 --- a/src/main/java/net/marakaner/calc/CalcController.java +++ b/src/main/java/net/marakaner/calc/CalcController.java @@ -1,122 +1,138 @@ package net.marakaner.calc; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; -import javafx.event.EventType; import javafx.fxml.Initializable; -import javafx.scene.control.TextField; -import javafx.scene.input.InputMethodEvent; +import javafx.scene.control.Label; +import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; +import javafx.scene.layout.VBox; +import net.objecthunter.exp4j.Expression; +import net.objecthunter.exp4j.ExpressionBuilder; import java.net.URL; import java.util.ResourceBundle; public class CalcController implements Initializable { - public TextField textField; + public Label label; + public VBox vbox; + + private String lastChar = ""; + + private void addChar(String next, boolean spacing) { + if(lastChar.equals("(") || lastChar.equals(")")) { + if(!next.matches("\\d")) { + return; + } + } + + this.label.setText((spacing ? " " : "") + next + (spacing ? " " : "")); + } + + private void addChar(String next) { + addChar(next, false); + } public void onSeven(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "7"); + addChar("7"); } public void onEight(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "8"); + addChar("8"); } public void onBracketRight(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + ")"); + addChar(")"); } public void onFour(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "4"); + addChar("4"); } public void onFive(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "5"); + addChar("5"); } public void onCE(ActionEvent actionEvent) { } public void onNine(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "9"); + addChar("9"); } public void onSix(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "6"); + addChar("6"); } public void onC(ActionEvent actionEvent) { - this.textField.setText(""); + this.label.setText(""); } public void onDivide(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + " / "); + addChar("/", true); } public void onMultiply(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + " * "); + addChar("*", true); } public void onOne(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "1"); + addChar("1"); } public void onTwo(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "2"); + addChar("2"); } public void onBracketLeft(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "("); + addChar("("); } public void onThree(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "3"); + addChar("3"); } public void onMinus(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + " - "); + addChar("-", true); } public void onPoint(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + "."); + addChar("."); } public void onSum(ActionEvent actionEvent) { + Expression expression = new ExpressionBuilder(this.label.getText()).build(); + + double result = expression.evaluate(); + + System.out.println(result % 1); + + if(result % 1.0 == 0.0) { + int intResult = (int) result; + this.label.setText("" + intResult); + } else { + this.label.setText("" + result); + } } public void onPlus(ActionEvent actionEvent) { - this.textField.setText(this.textField.getText() + " + "); - } - - public void onTextField(ActionEvent actionEvent) { - System.out.println(actionEvent.getClass().getName()); - } - - public void onTextChanged(InputMethodEvent inputMethodEvent) { - } - - public void onTextKeyPressed(KeyEvent keyEvent) { - } - - public void onTyped(KeyEvent keyEvent) { - } - - public void onTextReleased(KeyEvent keyEvent) { -// if(!keyEvent.getText().matches("\\d*")) { -// this.textField.setText(this.textField.getText().replaceAll(keyEvent.getText(), "")); -// } + addChar("+", true); } @Override public void initialize(URL url, ResourceBundle resourceBundle) { - this.textField.textProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observableValue, String oldValue, String newValue) { - if (!newValue.matches("\\d*")) { - textField.setText(newValue.replaceAll("[^\\d]", "")); - } + this.vbox.setOnKeyPressed(keyEvent -> { + + System.out.println(keyEvent.getText()); + + if(keyEvent.getText().matches("[\\d()]")) { + addChar(keyEvent.getText()); + } else if(keyEvent.getText().matches("[+\\-*/]")) { + addChar(keyEvent.getText(), true); } }); } + + public void onKeyPressed(KeyEvent keyEvent) { + System.out.println(keyEvent.getText()); + } } diff --git a/src/main/java/net/marakaner/calc/HelloApplication.java b/src/main/java/net/marakaner/calc/HelloApplication.java index b44c1f2..5ddc0b1 100644 --- a/src/main/java/net/marakaner/calc/HelloApplication.java +++ b/src/main/java/net/marakaner/calc/HelloApplication.java @@ -8,16 +8,40 @@ import javafx.stage.Stage; import java.io.IOException; public class HelloApplication extends Application { + + private static HelloApplication instance; + private Scene currentScene; + private Stage stage; + @Override public void start(Stage stage) throws IOException { + instance = this; + FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("calc-view.fxml")); - Scene scene = new Scene(fxmlLoader.load()); + this.currentScene = new Scene(fxmlLoader.load()); + stage.setTitle("Calculator"); - stage.setScene(scene); + stage.setScene(this.currentScene); + stage.setMinWidth(600); + stage.setMinHeight(400); stage.show(); + + this.stage = stage; } public static void main(String[] args) { launch(); } + + public Stage getStage() { + return stage; + } + + public static HelloApplication getInstance() { + return instance; + } + + public Scene getCurrentScene() { + return currentScene; + } } \ No newline at end of file diff --git a/src/main/resources/net/marakaner/calc/calc-view.fxml b/src/main/resources/net/marakaner/calc/calc-view.fxml index 7119891..7b1d029 100644 --- a/src/main/resources/net/marakaner/calc/calc-view.fxml +++ b/src/main/resources/net/marakaner/calc/calc-view.fxml @@ -1,21 +1,21 @@ - + - + - + - + + @@ -30,26 +30,86 @@ - + + + + + + + + + + + + + + + + + + +