vram78
Lieutenant
- Registriert
- Dez. 2015
- Beiträge
- 732
Hallo,
Ich möchte Java lernen und versuche mit JavaFX einen Taschenrechner zu coden. Nur habe ich total den Überblick verloren und verstehe selber nichts mehr.
Wenn ich beispielsweise auf die Enter Taste drücke, macht das Programm verrückte Sachen. Statt den Term auszurechnen, verschwindet der Term (Ergebnis wird gar nicht angezeigt) oder macht andere eigenartige Sachen.
Wenn ich sowas wie 999999999+8888888888 eingebe und auf die Enter Taste drücke, wird gar nichts ausgerechnet, stattdessen werden nur Nullen am Ende des Terms angehängt. Ich wollte es im Windows-Taschenrechner-Stil machen, aber es funktioniert nicht. Also bei sehr großen Zahlen sollte es sowas hier ausgeben "2,e+16", aber es funktioniert einfach nicht.
Mag mir jemand Tipps geben? :S
Der Code: Klasse GuiFX:
Klasse Function:
Gruß
Ich möchte Java lernen und versuche mit JavaFX einen Taschenrechner zu coden. Nur habe ich total den Überblick verloren und verstehe selber nichts mehr.
Wenn ich beispielsweise auf die Enter Taste drücke, macht das Programm verrückte Sachen. Statt den Term auszurechnen, verschwindet der Term (Ergebnis wird gar nicht angezeigt) oder macht andere eigenartige Sachen.
Wenn ich sowas wie 999999999+8888888888 eingebe und auf die Enter Taste drücke, wird gar nichts ausgerechnet, stattdessen werden nur Nullen am Ende des Terms angehängt. Ich wollte es im Windows-Taschenrechner-Stil machen, aber es funktioniert nicht. Also bei sehr großen Zahlen sollte es sowas hier ausgeben "2,e+16", aber es funktioniert einfach nicht.
Mag mir jemand Tipps geben? :S
Der Code: Klasse GuiFX:
Java:
package taschenrechner;
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
public class GuiFX extends Application {
private TextField display;
private final Map<String, Button> buttonMap = new HashMap<>();
private final Function func = new Function();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Taschenrechner");
display = new TextField();
display.setEditable(false);
display.setFocusTraversable(false);
display.setAlignment(Pos.CENTER_RIGHT);
display.setFont(Font.font("Consolas", 28));
display.setStyle("-fx-background-color: #1E1E1E; -fx-text-fill: white; " +
"-fx-background-radius: 12; -fx-border-radius: 12; -fx-border-color: #333;");
display.setPrefHeight(60);
ScrollPane scrollPane = new ScrollPane(display);
scrollPane.setFitToWidth(true);
scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
scrollPane.setStyle("-fx-background-color: transparent; -fx-border-color: transparent;");
GridPane grid = new GridPane();
grid.setHgap(8);
grid.setVgap(8);
grid.setAlignment(Pos.CENTER);
for (int i = 0; i < 4; i++) {
ColumnConstraints col = new ColumnConstraints();
col.setHgrow(Priority.ALWAYS);
grid.getColumnConstraints().add(col);
}
grid.add(scrollPane, 0, 0, 4, 1);
// Ziffernbuttons
Button[] zahlenButtons = new Button[10];
for (int i = 0; i <= 9; i++) {
int num = i;
zahlenButtons[i] = createButton(String.valueOf(num), "#F0F0F0", "#000");
zahlenButtons[i].setOnAction(e -> handleInput(String.valueOf(num)));
buttonMap.put(String.valueOf(num), zahlenButtons[i]);
}
// Operatoren + "=" + "C"
String[] ops = {"+", "-", "*", "/", "="};
for (String op : ops) {
Button btn = createButton(op, "#FF9500", "#fff");
btn.setOnAction(e -> handleInput(op));
buttonMap.put(op, btn);
}
Button cButton = createButton("C", "#FF3B30", "#fff");
cButton.setOnAction(e -> display.setText(""));
buttonMap.put("C", cButton);
// Buttons im Grid
grid.add(zahlenButtons[7], 0, 1);
grid.add(zahlenButtons[8], 1, 1);
grid.add(zahlenButtons[9], 2, 1);
grid.add(buttonMap.get("+"), 3, 1);
grid.add(zahlenButtons[4], 0, 2);
grid.add(zahlenButtons[5], 1, 2);
grid.add(zahlenButtons[6], 2, 2);
grid.add(buttonMap.get("-"), 3, 2);
grid.add(zahlenButtons[1], 0, 3);
grid.add(zahlenButtons[2], 1, 3);
grid.add(zahlenButtons[3], 2, 3);
grid.add(buttonMap.get("*"), 3, 3);
grid.add(zahlenButtons[0], 1, 4);
grid.add(buttonMap.get("="), 2, 4);
grid.add(buttonMap.get("/"), 3, 4);
grid.add(buttonMap.get("C"), 0, 4);
Scene scene = new Scene(grid, 380, 500, Color.web("#121212"));
scene.getRoot().requestFocus();
scene.setOnKeyPressed(e -> handleKeyPress(e.getCode()));
primaryStage.setScene(scene);
primaryStage.setResizable(false);
primaryStage.show();
}
private Button createButton(String text, String bgColor, String textColor) {
Button btn = new Button(text);
btn.setPrefSize(75, 75);
btn.setFont(Font.font("Consolas", 22));
btn.setStyle(
"-fx-background-color: " + bgColor + ";" +
"-fx-text-fill: " + textColor + ";" +
"-fx-background-radius: 15;" +
"-fx-border-radius: 15;" +
"-fx-border-color: #333;"
);
return btn;
}
private void handleInput(String input) {
String current = display.getText();
if ("+-*/".contains(input)) {
if (!current.isEmpty()) {
String last = current.substring(current.length() - 1);
if ("+-*/".contains(last)) {
display.setText(current.substring(0, current.length() - 1) + input);
return;
}
} else return;
}
if ("=".equals(input)) {
calculateResult();
return;
}
display.appendText(input);
}
private void calculateResult() {
try {
String text = display.getText();
if (text.isEmpty()) return;
String operator = "";
int opIndex = -1;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if ("+-*/".indexOf(c) >= 0) {
operator = String.valueOf(c);
opIndex = i;
break;
}
}
if (operator.isEmpty() || opIndex <= 0 || opIndex >= text.length() - 1) return;
BigDecimal a = new BigDecimal(text.substring(0, opIndex));
BigDecimal b = new BigDecimal(text.substring(opIndex + 1));
BigDecimal result = func.berechne(a.toString(), b.toString(), operator);
String resultStr = result.stripTrailingZeros().toPlainString();
// E-Notation wenn länger als 12 Zeichen
if (resultStr.length() > 12) {
resultStr = result.stripTrailingZeros().toEngineeringString();
}
display.setText(resultStr);
} catch (Exception e) {
display.setText("Error");
}
}
private void simulateButtonPress(Button btn) {
if (btn == null) return;
btn.arm();
btn.fire();
PauseTransition pt = new PauseTransition(Duration.millis(120));
pt.setOnFinished(e -> btn.disarm());
pt.play();
}
private void handleKeyPress(KeyCode code) {
switch (code) {
case DIGIT0, NUMPAD0 -> simulateButtonPress(buttonMap.get("0"));
case DIGIT1, NUMPAD1 -> simulateButtonPress(buttonMap.get("1"));
case DIGIT2, NUMPAD2 -> simulateButtonPress(buttonMap.get("2"));
case DIGIT3, NUMPAD3 -> simulateButtonPress(buttonMap.get("3"));
case DIGIT4, NUMPAD4 -> simulateButtonPress(buttonMap.get("4"));
case DIGIT5, NUMPAD5 -> simulateButtonPress(buttonMap.get("5"));
case DIGIT6, NUMPAD6 -> simulateButtonPress(buttonMap.get("6"));
case DIGIT7, NUMPAD7 -> simulateButtonPress(buttonMap.get("7"));
case DIGIT8, NUMPAD8 -> simulateButtonPress(buttonMap.get("8"));
case DIGIT9, NUMPAD9 -> simulateButtonPress(buttonMap.get("9"));
case ADD -> simulateButtonPress(buttonMap.get("+"));
case SUBTRACT -> simulateButtonPress(buttonMap.get("-"));
case MULTIPLY -> simulateButtonPress(buttonMap.get("*"));
case DIVIDE -> simulateButtonPress(buttonMap.get("/"));
case ENTER, EQUALS -> simulateButtonPress(buttonMap.get("="));
case BACK_SPACE -> {
String current = display.getText();
if (!current.isEmpty()) display.setText(current.substring(0, current.length() - 1));
}
default -> {}
}
}
}
Klasse Function:
Java:
package taschenrechner;
import java.math.BigDecimal;
public class Function {
public BigDecimal berechne(String aStr, String bStr, String operator) {
BigDecimal a = new BigDecimal(aStr);
BigDecimal b = new BigDecimal(bStr);
return switch (operator) {
case "+" -> a.add(b);
case "-" -> a.subtract(b);
case "*" -> a.multiply(b);
case "/" -> b.compareTo(BigDecimal.ZERO) != 0
? a.divide(b, 10, BigDecimal.ROUND_HALF_UP)
: BigDecimal.ZERO;
default -> BigDecimal.ZERO;
};
}
}
Gruß