Я пытаюсь закодировать научный калькулятор на Java. Однако у меня возникают трудности с попыткой рассчитать программу. Вы можете видеть в приведенном ниже коде, мне удалось заставить графический интерфейс работать с печатью чисел в графическом интерфейсе. Я также добавил функциональность к кнопке «+», чтобы сначала проверить ее, чтобы увидеть, работает ли программа.Java GUI Scientific Calculator
public class Gui extends JFrame {
private static JButton [] button = new JButton[36];
private static TextField tf;
private JPanel panel;
private JPanel panel1;
public Gui(){
super("Scientific Calculator");
panel = new JPanel();
panel1 = new JPanel(new GridLayout(0,4));
tf = new TextField(20);
tf.setEditable(false);
panel.add(tf);
button[0]=new JButton("Rad/Deg");
button[1]=new JButton("x!");
button[2]=new JButton("sqrt");
button[3]=new JButton("sin");
button[4]=new JButton("cos");
button[5]=new JButton("tan");
button[6]=new JButton("ln");
button[7]=new JButton("log");
button[8]=new JButton("1/x");
button[9]=new JButton("e^x");
button[10]=new JButton("x^2");
button[11]=new JButton("y^x");
button[12]=new JButton("|x|");
button[13]=new JButton("pi");
button[14]=new JButton("e");
button[15]=new JButton("C");
button[16]=new JButton("(");
button[17]=new JButton(")");
button[18]=new JButton("%");
button[19]=new JButton("/");
button[20]=new JButton("7");
button[21]=new JButton("8");
button[22]=new JButton("9");
button[23]=new JButton("*");
button[24]=new JButton("4");
button[25]=new JButton("5");
button[26]=new JButton("6");
button[27]=new JButton("-");
button[28]=new JButton("1");
button[29]=new JButton("2");
button[30]=new JButton("3");
button[31]=new JButton("+");
button[32]=new JButton(".");
button[33]=new JButton("0");
button[34] =new JButton("+/-");
button[35] =new JButton("=");
for(int i = 0; i<button.length;i++){
panel1.add(button[i]);
}
panel.add(panel1);
add(panel);
HandlerClass handler = new HandlerClass();
for(int i = 0; i<button.length;i++){
button[i].addActionListener(handler);
}
}
private class HandlerClass implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
double num1 = 0,num2;
String alreadyDisplayed = tf.getText();
String toDisplay = "";
if(e.getSource()==button[33]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[33].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[28]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[28].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[29]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[29].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[30]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[30].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[24]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[24].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[25]){
alreadyDisplayed = tf.getText();
toDisplay = (button[25].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[26]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[26].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[20]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[20].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[21]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[21].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[22]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[22].getText());
tf.setText(toDisplay);
}
if(e.getSource()==button[31]){
alreadyDisplayed = tf.getText();
toDisplay = alreadyDisplayed + (button[31].getText());
tf.setText(toDisplay);
}
Однако моя проблема заключается в том, что делать потом. Я пытаюсь сделать блок try и catch, чтобы увидеть, является ли первый вход числом, а затем преобразовать его в double, а затем сохранить в массиве, чтобы впоследствии использовать функцию оператора, а затем продолжать добавлять номера пока пользователь не захочет остановиться и выполнить расчет. Моя попытка этого кода ниже, но это неправильно. Может кто-нибудь, пожалуйста, предложите, что я делаю неправильно? Благодаря
try{
num1 = Double.parseDouble(toDisplay);
}
catch(NumberFormatException e1){
System.out.println("You have not entered a number");
}
double[] arr = new double[10];
for(int i=0; i<arr.length;i++){
arr[i]=num1;
String test = String.valueOf(arr[i]);
tf.setText(test);
}
EDIT Я написал новый код для простого калькулятора, как это рекомендовано другим пользователем, и это работает для двух входов. Однако я все еще получаю ошибки, когда пытаюсь реализовать несколько входов. Ниже приведен рабочий код для двух входных калькуляторов.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class CalcGui extends JFrame {
private JButton buttonZero;
private JButton buttonOne;
private JButton buttonTwo;
private JButton buttonThree;
private JButton buttonFour;
private JButton buttonFive;
private JButton buttonSix;
private JButton buttonSeven;
private JButton buttonEight;
private JButton buttonNine;
private JButton opButtonPlus;
private JButton opButtonMinus;
private JButton opButtonDivide;
private JButton opButtonMultiply;
private JButton opButtonEquals;
private JButton opButtonClear;
private TextField tf;
private JPanel numButtonPanel;
private JPanel opButtonPanel;
private JPanel basePanel;
public CalcGui(){
super("Scientific Calculator");
basePanel = new JPanel();
numButtonPanel = new JPanel(new GridLayout(0,4));
opButtonPanel = new JPanel(new GridLayout(0,1));
tf = new TextField(20);
tf.setEditable(false);
basePanel.add(tf);
buttonZero = new JButton("0");
numButtonPanel.add(buttonZero);
buttonOne = new JButton("1");
numButtonPanel.add(buttonOne);
buttonTwo = new JButton("2");
numButtonPanel.add(buttonTwo);
buttonThree = new JButton("3");
numButtonPanel.add(buttonThree);
buttonFour = new JButton("4");
numButtonPanel.add(buttonFour);
buttonFive = new JButton("5");
numButtonPanel.add(buttonFive);
buttonSix = new JButton("6");
numButtonPanel.add(buttonSix);
buttonSeven = new JButton("7");
numButtonPanel.add(buttonSeven);
buttonEight = new JButton("8");
numButtonPanel.add(buttonEight);
buttonNine = new JButton("9");
numButtonPanel.add(buttonNine);
basePanel.add(numButtonPanel);
opButtonPlus = new JButton("+");
opButtonMinus = new JButton("-");
opButtonDivide = new JButton("/");
opButtonMultiply = new JButton("*");
opButtonEquals = new JButton("=");
opButtonClear = new JButton("C");
opButtonPanel.add(opButtonPlus);
opButtonPanel.add(opButtonMinus);
opButtonPanel.add(opButtonDivide);
opButtonPanel.add(opButtonMultiply);
opButtonPanel.add(opButtonEquals);
opButtonPanel.add(opButtonClear);
basePanel.add(opButtonPanel);
add(basePanel);
HandlerClass handler = new HandlerClass();
buttonZero.addActionListener(handler);
buttonOne.addActionListener(handler);
buttonTwo.addActionListener(handler);
buttonThree.addActionListener(handler);
buttonFour.addActionListener(handler);
buttonFive.addActionListener(handler);
buttonSix.addActionListener(handler);
buttonSeven.addActionListener(handler);
buttonEight.addActionListener(handler);
buttonNine.addActionListener(handler);
opButtonPlus.addActionListener(handler);
opButtonMinus.addActionListener(handler);
opButtonDivide.addActionListener(handler);
opButtonMultiply.addActionListener(handler);
opButtonEquals.addActionListener(handler);
opButtonClear.addActionListener(handler);
}
private class HandlerClass implements ActionListener{
public void actionPerformed(ActionEvent e){
String alreadyDisplayed = tf.getText();
if(e.getSource()==buttonZero){
String buttonZeroText = alreadyDisplayed + buttonZero.getText();
tf.setText(buttonZeroText);
}else if(e.getSource()==buttonOne){
String buttonOneText = alreadyDisplayed + buttonOne.getText();
tf.setText(buttonOneText);
}else if(e.getSource()==buttonTwo){
String buttonTwoText = alreadyDisplayed + buttonTwo.getText();
tf.setText(buttonTwoText);
}else if(e.getSource()==buttonThree){
String buttonThreeText = alreadyDisplayed + buttonThree.getText();
tf.setText(buttonThreeText);
}else if(e.getSource()==buttonFour){
String buttonFourText = alreadyDisplayed + buttonFour.getText();
tf.setText(buttonFourText);
}else if(e.getSource()==buttonFive){
String buttonFiveText = alreadyDisplayed + buttonFive.getText();
tf.setText(buttonFiveText);
}else if(e.getSource()==buttonSix){
String buttonSixText = alreadyDisplayed + buttonSix.getText();
tf.setText(buttonSixText);
}else if(e.getSource()==buttonSeven){
String buttonSevenText = alreadyDisplayed + buttonSeven.getText();
tf.setText(buttonSevenText);
}else if(e.getSource()==buttonEight){
String buttonEightText = alreadyDisplayed + buttonEight.getText();
tf.setText(buttonEightText);
}else if(e.getSource()==buttonNine){
String buttonNineText = alreadyDisplayed + buttonNine.getText();
tf.setText(buttonNineText);
}else if(e.getSource()==opButtonPlus){
String opButtonPlusText = alreadyDisplayed + opButtonPlus.getText();
tf.setText(opButtonPlusText);
}else if(e.getSource()==opButtonEquals){
String opButtonEqualsText = alreadyDisplayed + opButtonEquals.getText();
tf.setText(opButtonEqualsText);
}else if(e.getSource()==opButtonMinus){
String opButtonMinusText = alreadyDisplayed + opButtonMinus.getText();
tf.setText(opButtonMinusText);
}else if(e.getSource()==opButtonMultiply){
String opButtonMultiplyText = alreadyDisplayed + opButtonMultiply.getText();
tf.setText(opButtonMultiplyText);
}else if(e.getSource()==opButtonDivide){
String opButtonDivideText = alreadyDisplayed + opButtonDivide.getText();
tf.setText(opButtonDivideText);
}else if(e.getSource()==opButtonClear){
String opButtonClearText = "";
tf.setText(opButtonClearText);
}
double result;
for(int i=0; i<alreadyDisplayed.length();i++){
if(e.getSource()==opButtonEquals){
if(alreadyDisplayed.charAt(i)=='+'){
result = Double.parseDouble(alreadyDisplayed.substring(0,i)) + Double.parseDouble(alreadyDisplayed.substring(i+1,alreadyDisplayed.length()));
tf.setText(alreadyDisplayed + "=" + result);
}else if(alreadyDisplayed.charAt(i)=='-'){
result = Double.parseDouble(alreadyDisplayed.substring(0,i)) - Double.parseDouble(alreadyDisplayed.substring(i+1,alreadyDisplayed.length()));
tf.setText(alreadyDisplayed + "=" + result);
}else if(alreadyDisplayed.charAt(i)=='/'){
result = Double.parseDouble(alreadyDisplayed.substring(0,i))/Double.parseDouble(alreadyDisplayed.substring(i+1,alreadyDisplayed.length()));
tf.setText(alreadyDisplayed + "=" + result);
}else if(alreadyDisplayed.charAt(i)=='*'){
result = Double.parseDouble(alreadyDisplayed.substring(0,i)) * Double.parseDouble(alreadyDisplayed.substring(i+1,alreadyDisplayed.length()));
tf.setText(alreadyDisplayed + "=" + result);
}
}
}
}
}
}
Часть У меня возникли трудности с получает номер и хранить его так, что я могу позволить пользователю вводить более двух значений. Так, например, если я вытащил цикл for в конце вышеприведенного кода и заменил его на это;
double []num1=new double[10];
double []num2=new double[10];
//double num1 = 0;
double temp =0;
String str[] = new String [10];
String []str1 = new String[10];
if(e.getActionCommand().equals("+"))
if(e.getSource() == opButtonEquals)
for(int i = 0; i<alreadyDisplayed.length(); i++){
if(alreadyDisplayed.charAt(i)=='+')
str[i] = alreadyDisplayed.substring(0,i);
num1[i] = Double.parseDouble(str[i]);
str1[i+1] = alreadyDisplayed.substring(i+1,alreadyDisplayed.length());
num2[i+1] = Double.parseDouble(str1[i]);
temp += num1[i] + num2[i+1];
tf.setText(Double.toString(temp));
}System.out.println(temp);
}
}
Так что, когда я пытаюсь проверить, чтобы увидеть, если температура имеет какое-либо значение в консоли, он просто печатает 0 каждый раз. Строковый текст отображается в текстовом поле, однако фактический расчет не работает. Я думал, что это сработает, сохранив номер, а затем сохранив другое число, а затем добавив их вместе, но это не так.
Сначала создается массив 'double [] arr = new double [10]' – danleyb2
Почему вы устанавливаете i в double, если при его использовании вы всегда бросаете его в int? Просто объявите его как int в цикле for. – JDrost1818
Я знаю, что это была глупая ошибка, я только что заметил это минуту назад. Внесет изменения сейчас – mp252