无法确定如何正确计算我的计算器

时间:2017-08-30 09:56:05

标签: java swing jframe calculator

这可能是你第n次收到有关计算器的新手问题,但我无法弄明白,已经工作了两到三天。我现在建立计算器的方式是不够的,我知道我必须在按下'='按钮时开始计算,但我根本无法弄清楚如何这样做。由于这个原因,我已经恢复到我原来的计算器代码,其中它计算我何时按下一个不起作用的操作按钮(如'+'),但我希望这可以让我正确地构建它。这是代码:

package rekenmachine;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.*;

public class Rekenmachine extends JFrame
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setSize(300,500);
        frame.setLocation(800,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Rekenmachine");
        RekenPaneel rekenpaneel = new RekenPaneel();
        frame.setContentPane(rekenpaneel);
        frame.setVisible(true);
    }

    private static int getal, totaalGetal;
    private boolean optellen, aftrekken, vermenigvuldigen, delen;

     public int Optellen(int getal)
    {
        reset();
        optellen = true;
        totaalGetal += getal;
        getal = 0;
        return totaalGetal;
    }
    public int Aftrekken(int getal)
    {
        reset();
        aftrekken = true;
        totaalGetal -= getal;
        getal = 0;
        return totaalGetal;
    }
    public int Delen(int getal)
    {
        reset();
        delen = true;
        totaalGetal /= getal;
        getal = 0;
        return totaalGetal;
    }
    public int Vermenigvuldigen(int getal)
    {
        reset();
        vermenigvuldigen = true;
        totaalGetal *= getal;
        getal = 0;
        return totaalGetal;
    }
    public int getGetal()
    {
        return getal;
    }
    public int getTotaalGetal()
    {
        return totaalGetal;
    }
    public void reset()
    {
        optellen = false;
        aftrekken = false;
        delen = false;
        vermenigvuldigen = false;

        getal = 0;
        totaalGetal = 0;
    }
}

class RekenPaneel extends JPanel
{
    JButton knop0, knop1, knop2, knop3, knop4, knop5, knop6, knop7, knop8, knop9,
            knopOptel, knopAftrek, knopVermenigvuldigen, knopDelen, knopUitkomst,
            knopWissen;
    JTextField invoerVak;
    JPanel textPaneel, knopPaneel, logoPaneel;
    Rekenmachine rekenmachine;

    public RekenPaneel()
    {
        rekenmachine = new Rekenmachine();

        setLayout(new BorderLayout());

        textPaneel = new JPanel();
        knopPaneel = new JPanel();
        logoPaneel = new JPanel();

        textPaneel.setLayout(new FlowLayout());
        knopPaneel.setLayout(new GridLayout(4,4));
        logoPaneel.setLayout(new FlowLayout());

        Border rand = BorderFactory.createEmptyBorder(10, 10, 10, 10);

        knop0 = new JButton("0");
        knop0.addActionListener(new knop0Handler());

        knop1 = new JButton("1");
        knop1.addActionListener(new knop1Handler());

        knop2 = new JButton("2");
        knop2.addActionListener(new knop2Handler());

        knop3 = new JButton("3");
        knop3.addActionListener(new knop3Handler());

        knop4 = new JButton("4");
        knop4.addActionListener(new knop4Handler());

        knop5 = new JButton("5");
        knop5.addActionListener(new knop5Handler());

        knop6 = new JButton("6");
        knop6.addActionListener(new knop6Handler());

        knop7 = new JButton("7");
        knop7.addActionListener(new knop7Handler());

        knop8 = new JButton("8");
        knop8.addActionListener(new knop8Handler());

        knop9 = new JButton("9");
        knop9.addActionListener(new knop9Handler());

        knopOptel = new JButton("+");
        knopOptel.addActionListener(new knopOptelHandler());

        knopAftrek = new JButton("-");
        knopAftrek.addActionListener(new knopAftrekHandler());

        knopVermenigvuldigen = new JButton("*");
        knopVermenigvuldigen.addActionListener(new knopVermenigvuldigenHandler());

        knopDelen = new JButton("/");
        knopDelen.addActionListener(new knopDelenHandler());

        knopUitkomst = new JButton("=");
        knopUitkomst.addActionListener(new knopUitkomstHandler());

        knopWissen = new JButton("C");
        knopWissen.addActionListener(new knopWissenHandler());

        invoerVak = new JTextField(25);
        invoerVak.setHorizontalAlignment(invoerVak.RIGHT);
        invoerVak.setEditable(false);
        invoerVak.setBackground(Color.WHITE);

        textPaneel.add(invoerVak);
        knopPaneel.add(knop7);
        knopPaneel.add(knop8);
        knopPaneel.add(knop9);
        knopPaneel.add(knopDelen);
        knopPaneel.add(knop4);
        knopPaneel.add(knop5);
        knopPaneel.add(knop6);
        knopPaneel.add(knopVermenigvuldigen);
        knopPaneel.add(knop1);
        knopPaneel.add(knop2);
        knopPaneel.add(knop3);
        knopPaneel.add(knopOptel);
        knopPaneel.add(knop0);
        knopPaneel.add(knopWissen);
        knopPaneel.add(knopUitkomst);
        knopPaneel.add(knopAftrek);

        add(textPaneel, BorderLayout.NORTH);
        add(knopPaneel, BorderLayout.CENTER);
        add(logoPaneel, BorderLayout.SOUTH);
    }
    class knop0Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "0");
        }
    }
    class knop1Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "1");
        }
    }
    class knop2Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "2");
        }
    }
    class knop3Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "3");
        }
    }
    class knop4Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "4");
        }
    }
    class knop5Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "5");
        }
    }
    class knop6Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "6");
        }
    }
    class knop7Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "7");
        }
    }
    class knop8Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "8");
        }
    }
    class knop9Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText(invoerVak.getText() + "9");
        }
    }
    class knopOptelHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            String invoer = invoerVak.getText();
            int invoerGetal = Integer.parseInt(invoer);
            rekenmachine.Optellen(invoerGetal);
            invoerVak.setText("");

        }
    }
    class knopAftrekHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            String invoer = invoerVak.getText();
            int invoerGetal = Integer.parseInt(invoer);
            rekenmachine.Aftrekken(invoerGetal);
            invoerVak.setText("");
        }
    }
    class knopVermenigvuldigenHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            String invoer = invoerVak.getText();
            int invoerGetal = Integer.parseInt(invoer);
            rekenmachine.Vermenigvuldigen(invoerGetal);
            invoerVak.setText("");
        }
    }
    class knopDelenHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            String invoer = invoerVak.getText();
            int invoerGetal = Integer.parseInt(invoer);
            rekenmachine.Delen(invoerGetal);
            invoerVak.setText("");
        }
    }
    class knopUitkomstHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            invoerVak.setText("" + rekenmachine.getTotaalGetal());
            rekenmachine.reset();
        }
    }
    class knopWissenHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            rekenmachine.reset();
            invoerVak.setText("");
        }
    }
}

它基本上做的是看起来像一个计算器,所有按钮都可以正常工作,但它的计算方式是关闭的,如果有的话。我认为我需要做的是保存一个数字,当我按+它应该添加下一个数字,如果我按 - 它应该减去下一个数字,如果我按*它应该乘以下一个数字,如果我按/它应该除以下一个数字,然后当我按=它应该显示结果,但我不知道该怎么做。

是否应该使用arraylist?如果是这样,我怎样才能正确保存结果?我的意思是,使用两个数字并不难,你只需保存两个数字并用它们做一些事情,然后显示结果,但一个人并不总是只使用两个数字。

为了解释这个问题,我有更清楚的说明:例如,当我输入'50'然后按'+'时,它应该将“50”转换为getal = 50并启动Optellen方法,然后totaalGetal应该变为50然后它会清空文本字段。如果我然后添加'3',当我按'='时应该说53但如果我很幸运它仍然显示50。为了解决这个问题,我假设我必须在按'='时进行计算,但在完成之前我不知道如何保存/计算数字。

在我丢失所有头发之前,有人能告诉我该做什么吗? :P

3 个答案:

答案 0 :(得分:1)

在开发某些内容时,您必须首先考虑如何来解决问题。通过设计解决方案从那里开展工作。如果您有可编程解决方案,请实施它。用户界面可能会更晚。这是开发人员应具备的核心技能。

1)你想要一个支持+, - ,/和*的计算器。如果" ="则应显示输出。点击。

2)想想课程。这个概念对你来说可能是新的,但你会在以后发现。执行计算的主要类是Rekenmachine。 (从设计的角度来看,它应该是一个独立的课程,但现在并不重要)。您需要将其与UI层分开。

您的类支持您使用UI实现的操作。这很好。但我也看到不应该存在的事情

public int Vermenigvuldigen(int getal)
{
    reset(); // reset the calculator ?
    vermenigvuldigen = true; // purpose ?
    totaalGetal *= getal;
    getal = 0; // resetting argument getal ?
    return totaalGetal;
}

在此,我不确定您为什么要拨打reset(),因为它的作用是

public void reset()
{
    optellen = false;
    aftrekken = false;
    delen = false;
    vermenigvuldigen = false;

    getal = 0;
    totaalGetal = 0;
}

阅读上述方法时,您会看到它重置了您尝试添加的值。当然,您的计算会出错,因为您正在删除以前的数据......将所有内容重置回初始状态。我也不理解" true"或"假"关于行动。也许对于用户界面?这不是必需的。

简单说明:

创建Rekenmachine时,默认情况下将变量totaalGetal设置为0。该变量保存到目前为止执行的计算值。这是一个开始。添加后,请使用

public void add(int getal) {
  totaalGetal+= getal; // means totaalGetal = totaalGetal + getal.
}

在调用add()之前,必须将字符串解析为整数。这可以在按钮操作中完成:

class knop1Handler implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        // get input
        String input = invoerVak.getText();
        // convert
        int converted = convertToInt(input);
        // instruct myRekenmachine to add the value
        myRekenmachine.add(converted);
    }
}

重要提示......使用简洁的命名..." knop1handler"难以阅读。使用" addButtonHandler"表示此类处理添加按钮。 convertToInt是一个读入String并返回整数的方法。你必须自己实现。 myRekenmachine是您的Rekenmachine课程的一个实例。

以上是添加。为其他操作数实现相同的操作。如果要调整UI,请在处理程序中执行此操作。

现在,当您按=时,只需返回totaalGetal值。

PS:不确定,但问你是否被允许用英文写名字。我的母语是荷兰语,但在我的CS课程中,我可以完全用英语编程。请尝试提问,因为如果你的目标是从事IT职业,英语是IT世界的主要语言。

答案 1 :(得分:1)

当您点击+时,您就是这样说的:

    knopOptel.addActionListener((ActionEvent e) ->
    {
        String invoer = invoerVak.getText();
        int invoerGetal = Integer.parseInt(invoer);
        rekenmachine.addition(invoerGetal);
        invoerVak.setText("");
    });

但是当您点击+时,您还没有进行计算!你应该做的是:

  • 用户键入数字
  • 用户点击+(例如)
  • ActionListener中,您可以阅读屏幕上的数字,将其存储在getal中,清除屏幕,然后将布尔值optel设置为true < /强>
  • 用户键入另一个号码
  • 用户点击相等
  • 在您的平等Listener中,您会读取您在屏幕上看到该数字的数字,并根据标志(示例中的optel)计算结果
  • 显示结果

确实,当你按下相同的时候进行计算。

一个小代码示例:

knopOptel.addActionListener((ActionEvent e) ->
{
    int invoerGetal = Integer.parseInt(invoerVak.getText()); // get the number
    calculate(invoerGetal); //sets totalNumber to what it should be by looking at the flags
    invoerVak.setText(totalNumber); // we write the temporary result
    additionFlag = true; // next number must be added
});

你的calculate函数应该是这样的:

private void calculate(int aInvoerGetal) {
    if (addition)
        totalNumber += aInvoerGetal;
    else if (substract)
        totalNumber -= aInvoerGetal;
    else if (divide)
        totalNumber /= aInvoerGetal;
    else if (multiply)
        totalNumber *= aInvoerGetal;

    resetFlags();
}

进一步:

现在,如果你想支持多个计算(5 + 5 + 5 + 3),那很容易。当您点击+-*/时,首先拨打equalActionListener

这样,您就会得到这样的序列:

  1. 5+ // ==&gt;等于叫==&gt; 5(因为标志都是假的)==&gt;将+标记为true

  2. 10+ // ==&gt;等于叫==&gt; 15因为内存中有5个并且+标志已打开。 +标志消失,然后重新开启(因为您再次按了+

  3. 4= // ==&gt;等于叫==&gt; 19

答案 2 :(得分:-2)

韦斯莱,在开始编码之前,你是否考虑过你想要计算器做什么?例如它会支持括号,sin / cos,记忆。您是否认为这些功能在逻辑上是如何工作的,然后考虑如何在Java中实现它们?当您开始使用新语言时,一些流程图和一些伪造的代码可能会有很长的路要走,如果只是为了帮助您理解您正在尝试做什么。

BTW我知道从GUI代码入手并进入应用程序的逻辑很有吸引力,但通常最好从逻辑开始然后转移到GUI。您可以对输入值进行硬编码,看看函数是否按预期运行,然后引入带有从其中传入的值的参数。

修改

我想我知道为什么你的+键无效。 reset()方法在添加之前将getal和totalGetal设置为0。 0 + 0为0.

knopOptel = new JButton("+");
        knopOptel.addActionListener(new knopOptelHandler()); 


 class knopOptelHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            String invoer = invoerVak.getText();
            int invoerGetal = Integer.parseInt(invoer);
            rekenmachine.Optellen(invoerGetal);
            invoerVak.setText("");

        }
    }


     public int Optellen(int getal)
    {
        reset();

            public void reset()
            {
            optellen = false;
            aftrekken = false;
            delen = false;
            vermenigvuldigen = false;

            getal = 0;
            totaalGetal = 0;
            }

    optellen = true;
    totaalGetal += getal;
    getal = 0;
    return totaalGetal;
}