finished the ability to type in numbers with the keyboard.

This commit is contained in:
Alex 2024-03-14 05:12:01 +01:00
parent 6db2d70b00
commit c85a85e8f5
6 changed files with 182 additions and 77 deletions

View File

@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">

View File

@ -38,6 +38,11 @@
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.objecthunter</groupId>
<artifactId>exp4j</artifactId>
<version>0.4.8</version>
</dependency>
</dependencies>
<build>

View File

@ -1,6 +1,7 @@
module net.marakaner.calc {
requires javafx.controls;
requires javafx.fxml;
requires exp4j;
opens net.marakaner.calc to javafx.fxml;

View File

@ -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<String>() {
@Override
public void changed(ObservableValue<? extends String> 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());
}
}

View File

@ -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;
}
}

View File

@ -1,21 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" stylesheets="@primer-dark.css" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="net.marakaner.calc.CalcController">
<VBox fx:id="vbox" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" onKeyPressed="#onKeyPressed" prefHeight="400.0" prefWidth="600.0" stylesheets="@primer-dark.css" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="net.marakaner.calc.CalcController">
<children>
<TextField fx:id="textField" alignment="CENTER_RIGHT" onAction="#onTextField" onInputMethodTextChanged="#onTextChanged" onKeyPressed="#onTextKeyPressed" onKeyReleased="#onTextReleased" onKeyTyped="#onTyped" prefHeight="164.0" prefWidth="600.0">
<Label fx:id="label" alignment="CENTER_RIGHT" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="80.0" textAlignment="RIGHT" VBox.vgrow="ALWAYS">
<font>
<Font size="34.0" />
<Font size="50.0" />
</font>
</TextField>
<GridPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="323.0" prefWidth="600.0">
</Label>
<GridPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="320.0" prefWidth="600.0" VBox.vgrow="ALWAYS">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
@ -30,26 +30,86 @@
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Button fx:id="seven" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onSeven" text="7" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" />
<Button fx:id="eight" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onEight" text="8" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<Button fx:id="bracketRight" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onBracketRight" text=")" GridPane.columnIndex="1" />
<Button fx:id="four" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onFour" text="4" GridPane.rowIndex="2" />
<Button fx:id="five" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onFive" text="5" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<Button fx:id="ce" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onCE" text="CE" GridPane.columnIndex="2" />
<Button fx:id="nine" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onNine" text="9" GridPane.columnIndex="2" GridPane.rowIndex="1" />
<Button fx:id="six" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onSix" text="6" GridPane.columnIndex="2" GridPane.rowIndex="2" />
<Button fx:id="c" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onC" text="C" GridPane.columnIndex="3" />
<Button fx:id="divide" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onDivide" text="÷" GridPane.columnIndex="3" GridPane.rowIndex="1" />
<Button fx:id="multiply" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onMultiply" text="×" GridPane.columnIndex="3" GridPane.rowIndex="2" />
<Button fx:id="one" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onOne" text="1" GridPane.rowIndex="3" />
<Button fx:id="two" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onTwo" text="2" GridPane.columnIndex="1" GridPane.rowIndex="3" />
<Button fx:id="bracketLeft" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onBracketLeft" text="(" />
<Button fx:id="three" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onThree" text="3" GridPane.columnIndex="2" GridPane.rowIndex="3" />
<Button fx:id="minus" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onMinus" text="-" GridPane.columnIndex="3" GridPane.rowIndex="3" />
<Button layoutX="10.0" layoutY="205.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="0" GridPane.rowIndex="4" />
<Button fx:id="point" layoutX="10.0" layoutY="75.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onPoint" text="." GridPane.columnIndex="1" GridPane.rowIndex="4" />
<Button fx:id="sum" layoutX="160.0" layoutY="205.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onSum" text="=" GridPane.columnIndex="2" GridPane.rowIndex="4" />
<Button fx:id="plus" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onPlus" text="+" GridPane.columnIndex="3" GridPane.rowIndex="4" />
<Button fx:id="seven" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onSeven" text="7" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="eight" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onEight" text="8" GridPane.columnIndex="1" GridPane.rowIndex="1">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="bracketRight" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onBracketRight" text=")" GridPane.columnIndex="1">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="four" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onFour" text="4" GridPane.rowIndex="2">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="five" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onFive" text="5" GridPane.columnIndex="1" GridPane.rowIndex="2">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="ce" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onCE" text="CE" GridPane.columnIndex="2">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="nine" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onNine" text="9" GridPane.columnIndex="2" GridPane.rowIndex="1">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="six" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onSix" text="6" GridPane.columnIndex="2" GridPane.rowIndex="2">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="c" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onC" text="C" GridPane.columnIndex="3">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="divide" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onDivide" text="÷" GridPane.columnIndex="3" GridPane.rowIndex="1">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="multiply" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onMultiply" text="×" GridPane.columnIndex="3" GridPane.rowIndex="2">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="one" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onOne" text="1" GridPane.rowIndex="3">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="two" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onTwo" text="2" GridPane.columnIndex="1" GridPane.rowIndex="3">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="bracketLeft" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onBracketLeft" text="(">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="three" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onThree" text="3" GridPane.columnIndex="2" GridPane.rowIndex="3">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="minus" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onMinus" text="-" GridPane.columnIndex="3" GridPane.rowIndex="3">
<font>
<Font size="30.0" />
</font></Button>
<Button layoutX="10.0" layoutY="205.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="0" GridPane.rowIndex="4">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="point" layoutX="10.0" layoutY="75.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onPoint" text="." GridPane.columnIndex="1" GridPane.rowIndex="4">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="sum" layoutX="160.0" layoutY="205.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onSum" text="=" GridPane.columnIndex="2" GridPane.rowIndex="4">
<font>
<Font size="30.0" />
</font></Button>
<Button fx:id="plus" layoutX="10.0" layoutY="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onPlus" text="+" GridPane.columnIndex="3" GridPane.rowIndex="4">
<font>
<Font size="30.0" />
</font></Button>
</children>
</GridPane>
</children>