这可能是你第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
答案 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
。
这样,您就会得到这样的序列:
5
,+
// ==&gt;等于叫==&gt; 5(因为标志都是假的)==&gt;将+
标记为true
10
,+
// ==&gt;等于叫==&gt; 15因为内存中有5个并且+
标志已打开。 +
标志消失,然后重新开启(因为您再次按了+
)
4
,=
// ==&gt;等于叫==&gt; 19
答案 2 :(得分:-2)
修改的
我想我知道为什么你的+键无效。 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;
}