Пытаюсь запрограммировать научный калькулятор на java, но не могу заставить работать кнопку экспоненты

Я пытаюсь запрограммировать научный калькулятор с графическим интерфейсом в java и до сих пор мог делать все, кроме кнопки экспоненты (x ^ y).

Вот что у меня есть для события нажатия кнопки прямо сейчас, но оно не работает, потому что я не могу понять, как принимать два значения, нажимая кнопку только один раз.

private void btnExponentActionPerformed(java.awt.event.ActionEvent evt) {                                            

    for (int i = 0; i < 2; i++)
    {
        if(i == 0)
        {
            double x = Double.parseDouble(String.valueOf(tfdDisplay.getText()));
        }
        else if(i == 1)
        {
            double y = Double.parseDouble(String.valueOf(tfdDisplay.getText()));
        }
        tfdDisplay.setText(null);
    }
    double ops = Math.pow(x, y);
    tfdDisplay.setText(String.valueOf(ops));
}                                           

Я хотел бы, чтобы он принимал значение, которое в настоящее время находится в текстовом поле, затем пользователь нажимал кнопку экспоненты, затем принимал следующее значение, которое они вставляли в качестве фактического значения экспоненты, а затем вычислял ответ, когда они нажимают "= " кнопка.

Я искал в Интернете и нашел видео, в котором показано, как сделать научный калькулятор с кнопкой экспоненты, но когда я следую его методу кодирования кнопки, он работает неправильно. Вместо этого он просто возводит в квадрат то, что находится внутри текстового поля, вместо того, чтобы позволить пользователю вводить свой собственный показатель степени.

Вот изображение того, как на самом деле выглядит калькулятор для справки.

картинка

Заранее спасибо!

редактировать: вот что я запрограммировал для кнопки «=».

String answer;
        secondnum = Double.parseDouble(tfdDisplay.getText());
        if(operations == "+")
        {
            result = firstnum + secondnum;
            answer = String.format("%.2f", result);
            tfdDisplay.setText(answer);
        }
        else if(operations == "-")
        {
            result = firstnum - secondnum;
            answer = String.format("%.2f", result);
            tfdDisplay.setText(answer);
        }
        else if(operations == "*")
        {
            result = firstnum * secondnum;
            answer = String.format("%.2f", result);
            tfdDisplay.setText(answer);
        }
        else if(operations == "/")
        {
            result = firstnum / secondnum;
            answer = String.format("%.2f", result);
            tfdDisplay.setText(answer);
        }

Должен ли я добавить это к кнопке "="?

else if(operations == "^")
        {
            result = Math.pow(firstnum, secondnum);
            answer = String.format("%.2f", result);
            tfdDisplay.setText(answer);
        }

person Carter Venable    schedule 08.11.2017    source источник
comment
В чем смысл цикла for? Это создает проблемы с областью действия, которые у вас есть, без какой-либо пользы. Этот код даже не должен запускаться, если я что-то не упустил. Вы также делаете x и y одним и тем же, поскольку извлекаете их значения из одного и того же элемента. Вы имели в виду, что y должен быть установлен другим элементом, чем tfdDisplay?   -  person Carcigenicate    schedule 09.11.2017
comment
Я думаю, вы неправильно понимаете, как работают текстовые поля. Он не будет ждать ввода пользователя, поэтому ваше первое значение будет проанализировано, а второе значение всегда будет пустым, потому что вы очищаете его в конце цикла. В качестве подсказки вы описываете, как решить эту проблему в своем вопросе - вам нужно получить только первое значение при нажатии кнопки экспоненты, а второе - при нажатии кнопки равенства.   -  person Obicere    schedule 09.11.2017


Ответы (2)


Итак, если я правильно понимаю, вы нажимаете кнопки digit, затем ^, затем digit и затем = и в этот момент у вас есть, например, 2^4 в качестве текста в элементе tfdDisplay. Затем вам нужно разделить текст и получить два значения, например:

private void btnExponentActionPerformed(java.awt.event.ActionEvent evt) {
    // Notice the double backslash, it's used because split wants a regular
    // expression, and ^ means the beginning of the string in regular
    // expressions, so you have to escape it using a backslash. The other
    // one is needed because you should escape backslashes on strings to use
    // as is
    String parts[] = tfdDisplay.getText().split("\\^");
    double x = Double.parseDouble(parts[0]);
    double y = Double.parseDouble(parts[1]);
    double ops = Math.pow(x, y);
    tfdDisplay.setText(String.valueOf(ops));
}
person Piyin    schedule 08.11.2017

Так я понял, как решить мою проблему.

Вот что я поместил в событие нажатия кнопки:

    private void btnExponentActionPerformed(java.awt.event.ActionEvent evt) {                                            

        firstnum = Double.parseDouble(tfdDisplay.getText());
        tfdDisplay.setText(null);
        operations = "^";
    }                                           

и вот что я добавил к событию нажатия кнопки "=":

else if(operations == "^")
{
    result = Math.pow(firstnum, secondnum);
    answer = String.format("%.2f", result);
    tfdDisplay.setText(answer);
}

Спасибо, Obicere!

person Carter Venable    schedule 09.11.2017