From 886f80dbd957f71fb2803a9f82ed66b3c0078559 Mon Sep 17 00:00:00 2001 From: Dennis Eisold <de@itstall.de> Date: Tue, 5 Nov 2019 17:31:53 +0100 Subject: [PATCH] Added Keybindings --- src/de/itstall/TaschenrechnerGui.java | 203 ++++++++++++++++++-------- 1 file changed, 142 insertions(+), 61 deletions(-) diff --git a/src/de/itstall/TaschenrechnerGui.java b/src/de/itstall/TaschenrechnerGui.java index c38f56a..fd0190f 100644 --- a/src/de/itstall/TaschenrechnerGui.java +++ b/src/de/itstall/TaschenrechnerGui.java @@ -4,6 +4,7 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; public class TaschenrechnerGui extends JFrame { JButton btnCalc = new JButton("Berechnen"); @@ -15,6 +16,107 @@ public class TaschenrechnerGui extends JFrame { public TaschenrechnerGui() { this.initializeComponents(); this.anzeigen(); + this.keyboardEvent(); + } + + /** + * Wenn der Text das Zeichen "+" enthält, sucht die Methode das erste Vorkommen von "+" und ruft + * sich selbst mit den Werten links und rechts des "+" wieder auf. + * Beispiel für die erste Rekursionsstufe: Input: 2+3+4+5 + * 1. Splitten des Strings in "2" und "3+4+5" + * 2. Aufruf der Methode auf dem zweiten Teilstring, solange bis nur noch Zahlen übrig bleiben + * oder der Text leer ist. Dann werden die beiden Literale summiert und zurückgegeben. + * <p> + * Die "Strichoperationen" ("+" und "-") müssen als erstes angesprochen werden, damit sie die letzten + * Operationen in der Rekursionsschleife sind. So erreicht man Punkt- vor Strichrechnung. + * <p> + * Der Rückgabewert ist vom Typ Double, da Division Gleitkommazahlen ergeben kann. + */ + public static Double berechnen(String text) { + + if (text.contains("+")) { + return berechnen(text.substring(0, text.indexOf("+"))) + berechnen(text.substring(text.indexOf("+") + 1)); + } else if (text.contains("-")) { + return berechnen(text.substring(0, text.indexOf("-"))) - berechnen(text.substring(text.indexOf("-") + 1)); + } else if (text.contains("*")) { + return berechnen(text.substring(0, text.indexOf("*"))) * berechnen(text.substring(text.indexOf("*") + 1)); + } else if (text.contains("/")) { + return berechnen(text.substring(0, text.indexOf("/"))) / berechnen(text.substring(text.indexOf("/") + 1)); + } + + if (text.isEmpty()) return 0.0; + + return Double.parseDouble(text); + } + + public final void keyboardEvent() { + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .addKeyEventDispatcher(new KeyEventDispatcher() { + @Override + public boolean dispatchKeyEvent(KeyEvent e) { + KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(e); + /*switch(e.getKe()) { + case "ENTER": + break; + }*/ + if (keyStroke.isOnKeyRelease()) { + if (e.getKeyCode() == 10) { + calculate(); + } else if (e.getKeyCode() == 27) { + clearDisplay(); + } else { + switch (e.getKeyChar()) { + case '0': + addSign("0"); + break; + case '1': + addSign("1"); + break; + case '2': + addSign("2"); + break; + case '3': + addSign("3"); + break; + case '4': + addSign("4"); + break; + case '5': + addSign("5"); + break; + case '6': + addSign("6"); + break; + case '7': + addSign("7"); + break; + case '8': + addSign("8"); + break; + case '9': + addSign("9"); + break; + case '/': + addSign("/"); + break; + case '*': + addSign("*"); + break; + case '-': + addSign("-"); + break; + case '+': + addSign("+"); + break; + } + System.out.println(e.getKeyCode()); + System.out.println(e.getKeyChar()); + } + } + + return false; + } + }); } public void anzeigen() { @@ -24,45 +126,46 @@ public class TaschenrechnerGui extends JFrame { public void initializeComponents() { this.setLayout(new BorderLayout()); this.setTitle("Taschenrechner"); - this.setSize(300,200); + this.setSize(300, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); panel = new JPanel(); panel.setLayout(new GridLayout(4, 5)); + txtCalculation.setBounds(20, 20, 260, 20); + txtCalculation.setHorizontalAlignment(JTextField.RIGHT); + this.add(txtCalculation, BorderLayout.PAGE_START); + ActionListener insert = new InsertAction(); ActionListener result = new ResultAction(); ActionListener clear = new ClearAction(); - txtCalculation.setBounds(20, 20, 260 ,20); - txtCalculation.setHorizontalAlignment(JTextField.RIGHT); - this.add(txtCalculation, BorderLayout.PAGE_START); + addButton("7", insert, "7"); + addButton("8", insert, "8"); + addButton("9", insert, "9"); + addButton("+", insert, "+"); - addButton("7", insert); - addButton("8", insert); - addButton("9", insert); - addButton("+", insert); + addButton("4", insert, "4"); + addButton("5", insert, "5"); + addButton("6", insert, "6"); + addButton("-", insert, "-"); - addButton("4", insert); - addButton("5", insert); - addButton("6", insert); - addButton("-", insert); + addButton("1", insert, "1"); + addButton("2", insert, "2"); + addButton("3", insert, "3"); + addButton("*", insert, "*"); - addButton("1", insert); - addButton("2", insert); - addButton("3", insert); - addButton("*", insert); - - addButton("cls", clear); - addButton("0", insert); - addButton("=", result); - addButton("/", insert); + addButton("cls", clear, "ESC"); + addButton("0", insert, "0"); + addButton("=", result, "ENTER"); + addButton("/", insert, "/"); this.add(panel, BorderLayout.CENTER); } - public void addButton(String label, ActionListener listener) { + public void addButton(String label, ActionListener listener, String key) { + InputMap im = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); JButton button = new JButton(label); button.addActionListener(listener); panel.add(button); @@ -70,8 +173,8 @@ public class TaschenrechnerGui extends JFrame { public String replaceSigns(String strDisplay) { - if(strDisplay.startsWith("= ") && !(strDisplay.endsWith("+") || strDisplay.endsWith("-") || strDisplay.endsWith("*") || strDisplay.endsWith("/"))) { - strDisplay = strDisplay.substring(strDisplay.length()-1); + if (strDisplay.startsWith("= ") && !(strDisplay.endsWith("+") || strDisplay.endsWith("-") || strDisplay.endsWith("*") || strDisplay.endsWith("/"))) { + strDisplay = strDisplay.substring(strDisplay.length() - 1); } else { strDisplay = strDisplay.replace("= ", ""); strDisplay = strDisplay.replace("**", "*"); @@ -86,11 +189,23 @@ public class TaschenrechnerGui extends JFrame { return strDisplay; } + private void calculate() { + txtCalculation.setText("= " + berechnen(txtCalculation.getText())); + } + + private void clearDisplay() { + txtCalculation.setText(""); + } + + public void addSign(String sign) { + txtCalculation.setText(replaceSigns(txtCalculation.getText() + sign)); + } + private class InsertAction implements ActionListener { @Override public void actionPerformed(ActionEvent actionEvent) { - txtCalculation.setText(replaceSigns(txtCalculation.getText() + ((JButton) actionEvent.getSource()).getText())); + addSign(((JButton) actionEvent.getSource()).getText()); } } @@ -98,7 +213,7 @@ public class TaschenrechnerGui extends JFrame { @Override public void actionPerformed(ActionEvent actionEvent) { - txtCalculation.setText("= " + String.valueOf(berechnen(txtCalculation.getText()))); + calculate(); } } @@ -106,41 +221,7 @@ public class TaschenrechnerGui extends JFrame { @Override public void actionPerformed(ActionEvent actionEvent) { - txtCalculation.setText(""); - } - } - - private void calculate() { - lblResult.setText(String.valueOf(berechnen(txtCalculation.getText()))); - } - - /** - * Wenn der Text das Zeichen "+" enthält, sucht die Methode das erste Vorkommen von "+" und ruft - * sich selbst mit den Werten links und rechts des "+" wieder auf. - * Beispiel für die erste Rekursionsstufe: Input: 2+3+4+5 - * 1. Splitten des Strings in "2" und "3+4+5" - * 2. Aufruf der Methode auf dem zweiten Teilstring, solange bis nur noch Zahlen übrig bleiben - * oder der Text leer ist. Dann werden die beiden Literale summiert und zurückgegeben. - * - * Die "Strichoperationen" ("+" und "-") müssen als erstes angesprochen werden, damit sie die letzten - * Operationen in der Rekursionsschleife sind. So erreicht man Punkt- vor Strichrechnung. - * - * Der Rückgabewert ist vom Typ Double, da Division Gleitkommazahlen ergeben kann. - */ - public static Double berechnen(String text) { - - if (text.contains("+")) { - return berechnen(text.substring(0, text.indexOf("+"))) + berechnen(text.substring(text.indexOf("+")+1)); - } else if (text.contains("-")) { - return berechnen(text.substring(0, text.indexOf("-"))) - berechnen(text.substring(text.indexOf("-")+1)); - } else if (text.contains("*")) { - return berechnen(text.substring(0, text.indexOf("*"))) * berechnen(text.substring(text.indexOf("*")+1)); - } else if (text.contains("/")) { - return berechnen(text.substring(0, text.indexOf("/"))) / berechnen(text.substring(text.indexOf("/")+1)); + clearDisplay(); } - - if (text.isEmpty()) return 0.0; - - return Double.parseDouble(text); } } -- GitLab