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"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager"> <component name="MavenProjectsManager">

View File

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

View File

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

View File

@ -1,122 +1,138 @@
package net.marakaner.calc; package net.marakaner.calc;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.event.EventType;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.control.TextField; import javafx.scene.control.Label;
import javafx.scene.input.InputMethodEvent; import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent; 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.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class CalcController implements Initializable { 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) { public void onSeven(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "7"); addChar("7");
} }
public void onEight(ActionEvent actionEvent) { public void onEight(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "8"); addChar("8");
} }
public void onBracketRight(ActionEvent actionEvent) { public void onBracketRight(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + ")"); addChar(")");
} }
public void onFour(ActionEvent actionEvent) { public void onFour(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "4"); addChar("4");
} }
public void onFive(ActionEvent actionEvent) { public void onFive(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "5"); addChar("5");
} }
public void onCE(ActionEvent actionEvent) { public void onCE(ActionEvent actionEvent) {
} }
public void onNine(ActionEvent actionEvent) { public void onNine(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "9"); addChar("9");
} }
public void onSix(ActionEvent actionEvent) { public void onSix(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "6"); addChar("6");
} }
public void onC(ActionEvent actionEvent) { public void onC(ActionEvent actionEvent) {
this.textField.setText(""); this.label.setText("");
} }
public void onDivide(ActionEvent actionEvent) { public void onDivide(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + " / "); addChar("/", true);
} }
public void onMultiply(ActionEvent actionEvent) { public void onMultiply(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + " * "); addChar("*", true);
} }
public void onOne(ActionEvent actionEvent) { public void onOne(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "1"); addChar("1");
} }
public void onTwo(ActionEvent actionEvent) { public void onTwo(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "2"); addChar("2");
} }
public void onBracketLeft(ActionEvent actionEvent) { public void onBracketLeft(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "("); addChar("(");
} }
public void onThree(ActionEvent actionEvent) { public void onThree(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "3"); addChar("3");
} }
public void onMinus(ActionEvent actionEvent) { public void onMinus(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + " - "); addChar("-", true);
} }
public void onPoint(ActionEvent actionEvent) { public void onPoint(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + "."); addChar(".");
} }
public void onSum(ActionEvent actionEvent) { 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) { public void onPlus(ActionEvent actionEvent) {
this.textField.setText(this.textField.getText() + " + "); addChar("+", true);
}
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(), ""));
// }
} }
@Override @Override
public void initialize(URL url, ResourceBundle resourceBundle) { public void initialize(URL url, ResourceBundle resourceBundle) {
this.textField.textProperty().addListener(new ChangeListener<String>() { this.vbox.setOnKeyPressed(keyEvent -> {
@Override
public void changed(ObservableValue<? extends String> observableValue, String oldValue, String newValue) { System.out.println(keyEvent.getText());
if (!newValue.matches("\\d*")) {
textField.setText(newValue.replaceAll("[^\\d]", "")); 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; import java.io.IOException;
public class HelloApplication extends Application { public class HelloApplication extends Application {
private static HelloApplication instance;
private Scene currentScene;
private Stage stage;
@Override @Override
public void start(Stage stage) throws IOException { public void start(Stage stage) throws IOException {
instance = this;
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("calc-view.fxml")); 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.setTitle("Calculator");
stage.setScene(scene); stage.setScene(this.currentScene);
stage.setMinWidth(600);
stage.setMinHeight(400);
stage.show(); stage.show();
this.stage = stage;
} }
public static void main(String[] args) { public static void main(String[] args) {
launch(); 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"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?> <?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?> <?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> <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>
<Font size="34.0" /> <Font size="50.0" />
</font> </font>
</TextField> </Label>
<GridPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="323.0" prefWidth="600.0"> <GridPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="320.0" prefWidth="600.0" VBox.vgrow="ALWAYS">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<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 minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints> </rowConstraints>
<children> <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="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" /> <font>
<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 size="30.0" />
<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></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" /> <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="ce" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onCE" text="CE" GridPane.columnIndex="2" /> <font>
<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 size="30.0" />
<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></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" /> <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="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>
<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 size="30.0" />
<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></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" /> <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="bracketLeft" layoutX="10.0" layoutY="91.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#onBracketLeft" text="(" /> <font>
<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 size="30.0" />
<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></Button>
<Button layoutX="10.0" layoutY="205.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="0" GridPane.rowIndex="4" /> <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="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>
<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 size="30.0" />
<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></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> </children>
</GridPane> </GridPane>
</children> </children>