【问题标题】:Re-adding /re-dividing not working重新添加/重新划分不起作用
【发布时间】:2017-08-25 19:13:19
【问题描述】:

我从网上下载了一个计算器程序,然后根据需要对其进行自定义。编辑代码后,当我添加假设 2+3 时,它将显示正确答案。但在那之后,如果我除/乘或做任何事情,它不会显示正确的答案。

equalsButton.addActionListener(new ActionListener()
    {

        public void actionPerformed(ActionEvent event)
        {
            if (!numberCalc.getText().isEmpty())
            {
                int number = Integer.parseInt(numberCalc.getText());
                String calc;
                double calculate;

                switch (calcOperation){

                    case 1:
                    calculate = currentCalc  + number;
                    currentCalc = calculate;
                    calc = String.valueOf(calculate);
                    numberCalc.setText(calc);
                    break;

                    case 2:
                    calculate = currentCalc  - number;
                    currentCalc = calculate;
                    calc = String.valueOf(calculate);
                    numberCalc.setText(calc);
                    break;

                    case 3:
                    calculate = currentCalc * number;
                    currentCalc = calculate;
                    calc = String.valueOf(calculate);
                    numberCalc.setText(calc);
                    break;

                    case 4:
                    calculate = currentCalc / number;
                    currentCalc = calculate;
                    if(currentCalc == 0){
                        JOptionPane.showMessageDialog(null, "You Can't divide 0! Have a good day!");
                    }
                    calc = String.valueOf(calculate);
                    numberCalc.setText(calc);
                    break;

                    case 5:
                    numberCalc.setText(null);
                    break;
                }

            }
          }
        });

【问题讨论】:

  • “它没有显示正确的答案” 你的问题是什么? “我也试图……” SO 是一个问答网站,而不是帮助台。每个线程都应该有一个明确、具体的问题。一般提示: 1) 为了尽快获得更好的帮助,请发布minimal reproducible exampleShort, Self Contained, Correct Example。 2) 请对代码和代码 sn-ps、HTML/XML 等结构化文档或输入/输出使用代码格式。为此,请选择文本并单击消息发布/编辑表单顶部的{} 按钮。
  • 请不要介意。我上传了它以便更好地理解! :( 让我编辑一下。
  • 请检查它的格式是否正确。我真的很抱歉浪费了你的时间。 :(
  • 我实际上用你的计算器做了一个简单的乘法检查,结果很好。现在让我们看看你到底面临着什么?
  • @Yohannes 假设我执行 2+3,它会显示 5。但之后如果我执行 5-2,它将显示 7。意味着只使用一个操作员。不转换为其他。

标签: java swing jframe


【解决方案1】:

我对您的代码做了一些更改。这个应该可以的。它引发了异常,因为当您将上一个操作的双精度类型输出用于下一个操作时,您正在使用 Integer.parseInt(..) 解析双精度值。

package com.example;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.*;

import javax.imageio.ImageIO;
import javax.swing.*;


    public class SimpleCalc implements ActionListener{

        JFrame guiFrame;
        JPanel buttonPanel;
        JTextField numberCalc;
        int calcOperation = 0;
        double currentCalc;

        //Note: Typically the main method will be in a
        //separate class. As this is a simple one class
        //example it's all in the one class.
        public static void main(String[] args) {

             //Use the event dispatch thread for Swing components
             EventQueue.invokeLater(new Runnable()
             {

                @Override
                 public void run()
                 {

                     new SimpleCalc();         
                 }
             });

        }

        public SimpleCalc()
        {
            guiFrame = new JFrame();

            //make sure the program exits when the frame closes
            guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            guiFrame.setTitle("Calculator Project");
            guiFrame.setSize(400,400);

            //This will center the JFrame in the middle of the screen
            guiFrame.setLocationRelativeTo(null);

            numberCalc = new JTextField();
            numberCalc.setHorizontalAlignment(JTextField.RIGHT);
            numberCalc.setLayout(null);
            numberCalc.setSize(100,400);
            numberCalc.setEditable(false);

            guiFrame.add(numberCalc, BorderLayout.NORTH);

            buttonPanel = new JPanel();


            buttonPanel.setLayout(new GridLayout(4,4));   
            guiFrame.add(buttonPanel, BorderLayout.CENTER);

            //Add the number buttons
            for (int i=0;i<10;i++)
            {
                addButton(buttonPanel, String.valueOf(i));
            }

            JButton clrButton = new JButton("C");
            clrButton.setActionCommand("C");

            OperatorAction clrAction = new OperatorAction(5);
            clrButton.addActionListener(clrAction);

            JButton subsButton = new JButton("*");
            subsButton.setActionCommand("*");

            OperatorAction subsAction = new OperatorAction(3);
            subsButton.addActionListener(subsAction);

            JButton divideButton = new JButton("/");
            divideButton.setActionCommand("/");

            OperatorAction divideAction = new OperatorAction(4);
            divideButton.addActionListener(divideAction);


            JButton addButton = new JButton("+");
            addButton.setActionCommand("+");

            OperatorAction subAction = new OperatorAction(1);
            addButton.addActionListener(subAction);

            JButton subButton = new JButton("-");
            subButton.setActionCommand("-");

            OperatorAction addAction = new OperatorAction(2);
            subButton.addActionListener(addAction);

            JButton equalsButton = new JButton("=");
            equalsButton.setActionCommand("=");
            equalsButton.addActionListener(new ActionListener()
            {

                public void actionPerformed(ActionEvent event)
                {
                    if (!numberCalc.getText().isEmpty())
                    {
                        int number = Integer.parseInt(numberCalc.getText());
                        String calc;
                        double calculate;

                        switch (calcOperation){

                            case 1:
                            calculate = currentCalc  + number;
                            currentCalc = calculate;
                            calc = String.valueOf(calculate);
                            numberCalc.setText(calc);
                            break;

                            case 2:
                            calculate = currentCalc  - number;
                            currentCalc = calculate;
                            calc = String.valueOf(calculate);
                            numberCalc.setText(calc);
                            break;

                            case 3:
                            calculate = currentCalc * number;
                            currentCalc = calculate;
                            calc = String.valueOf(calculate);
                            numberCalc.setText(calc);
                            break;

                            case 4:
                            calculate = currentCalc / number;
                            currentCalc = calculate;
                            if(currentCalc == 0){
                                JOptionPane.showMessageDialog(null, "You Can't  divide 0! Have a good day!");
                            }
                            calc = String.valueOf(calculate);
                            numberCalc.setText(calc);
                            break;

                            case 5:
                            numberCalc.setText(null);
                            break;
                        }

                    }




                    }
                });

            buttonPanel.add(addButton);
            buttonPanel.add(subButton);
            buttonPanel.add(subsButton);
            buttonPanel.add(divideButton);
            buttonPanel.add(equalsButton);
            buttonPanel.add(clrButton);
            guiFrame.setVisible(true);  
        }

        //All the buttons are following the same pattern
        //so create them all in one place.
        private void addButton(Container parent, String name)
        {
            JButton but = new JButton(name);
            but.setActionCommand(name);
            but.addActionListener(this);
            parent.add(but);
        }


        @Override
        public void actionPerformed(ActionEvent event)
        {
            //get the Action Command text from the button
            String action = event.getActionCommand();

            //set the text using the Action Command text
            numberCalc.setText(action);       
        }



        private class OperatorAction implements ActionListener
        {
            private int operator;

            public OperatorAction(int operation)
            {
                operator = operation;
            }

            public void actionPerformed(ActionEvent event)
            {
                currentCalc = Double.parseDouble(numberCalc.getText()); 
                calcOperation = operator;
            }
        }
    }

【讨论】:

  • 是的...也许问题出在 double & int 类型上... :(
  • 是的,不要更改类型,而是使用 Double.parseDouble,就像我在代码中所做的那样。这样你也将满足小数。也接受答案
  • 看来您发布的代码与我发布的代码相同。但是谢谢你的想法......
  • 老兄这不是同一个代码。你可以验证一下。这是一个工作代码,你的不起作用。走到最后看看变化。
猜你喜欢
  • 1970-01-01
  • 2018-06-14
  • 2017-12-29
  • 2012-05-31
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多