Java计算器运算符错误

时间:2015-07-09 21:20:30

标签: java swing

我用Java swing库构建了一个计算器。除了actionEvent循环中的乘法和除法运算符之外,其他所有东西都可以工作。所有其他操作员都完全工作。

这是错误发生的: 我已经在代码的这一部分尝试了一个try语句

计算器:

enter image description here

计算器乘法错误:

  1. 首先输入数字

  2. 然后按下操作员,这是为了清除文本字段 - 此步骤发生错误

  3. 然后输入第二个数字

  4. 然后按=按钮输出答案

  5. Enter Number enter image description here enter image description here enter image description here

    错误图片:

    if(e.equals("*"))
    {
            fnum = txt.getText();
            logic.setTotal(fnum);
            op = "*";
            txt.setText(""); // error occurs here, textfield isn't cleared
            JOptionPane.showMessageDialog(null, fnum); //messagebox to see if fnum contains the string from the textfield
    }
    if(e.equals("/"))
    {
            fnum = txt.getText();
            op = "/";
            txt.setText("");
    }
    

    ActionEvent循环/功能:

    public void actionPerformed(ActionEvent ea)
    {
        else if(op.equals("*"))
        {
            logic.setTotal(fnum);
            logic.multiplication(snum);
            total1 = logic.total;
        }
        else if(op.equals("/"))
        {
            logic.setTotal(fnum);
            logic.divide(snum);
            total1 = logic.total;
        }
        txt.setText(""+total1);
    }
    

    逻辑是内在的

    内部阶级:

    public class Inner extends Calculators{
        public double total;
        public Inner()
        {
            total = 0;
        }
        public void setTotal(String n)
        {
            total = convertToNumber(n); 
        }
        public void divide(String n)
        {
            total /= convertToNumber(n);
        }
        public void multiplication(String n)
        {
            total *=convertToNumber(n);
        }
    }
    

    如果您感到困惑,请索取更多代码,因为我无法包含所有代码。

    Code if you want to try it out yourself

2 个答案:

答案 0 :(得分:3)

您最初是这样创建按钮的:

    ...
    JButton plus = new JButton("+");
    JButton multiplication = new JButton("*");
    JButton divide = new JButton("/");
    JButton minus = new JButton("-");
    ...

然后添加this作为动作侦听器。但是有些线路丢失了:

    ...
    plus.addActionListener(this);
    // missing: multiplication.addActionListener(this);
    // missing: divide.addActionListener(this);
    minus.addActionListener(this);
    ...

我是如何找到错误的:

  1. 下载代码,编译等
  2. 执行代码,尝试添加,乘法等(检查应用程序的行为)。这是一种黑盒测试
  3. 通过分析代码,查看加法和乘法之间的差异。这与白盒测试有关。
  4. 我看到,应该调用JOptionPane.showMessageDialog(null, fnum); - 但是没有被调用。所以我坐在断点(在eclipse中)进行调试
  5. 当我意识到,我没有调用actionPerformed方法时,我搜索了注册ActionListeners的代码行。
  6. 除此之外:我强烈建议重构您的代码。您可以从重新考虑代码结构中受益。您将获得更好的可读性,代码将更易于维护,并且可以更快地实现新功能。

    我建议:

    • 降低字段的可见性。创建字段private,以便您可以轻松找到对它们的所有引用。
    • 避免重复(称为不要重复技术)。例如:不是为每个按钮调用addActionListener而是创建按钮集合(即ArrayList<JButton>并使用for循环为每个按钮调用addActionListener
    • 还可以通过定义更多但更短的方法
    • 来避免重复的代码片段
    • 考虑删除您的班级Calculators,并将该代码直接放入Inner的方法中。
    • Inner找到更有意义的名称。也许IntermediateResult或类似。
    • 为每个按钮创建单独的ActionListener实例。这将花费一点性能(人类无法察觉),但会避免长if - 链
    • 代码审核(在StackExchange网络中)发布您的代码,以获取更多帮助和新想法

答案 1 :(得分:3)

只是一个侧面推荐,与您的主要问题无关,这就是为什么我将此作为社区Wiki发布而不是作为答案:避免不惜一切代价使用空布局。当然,null布局和setBounds(...)似乎可以像创建复杂GUI的最简单和最好的方式一样,更多的Swing GUI,你会创造更严重的困难。在使用它们时遇到。当GUI调整大小时,他们不会调整组件的大小,他们是增强或维护的皇室女巫,当他们放置在滚动窗格中时,他们完全失败,当他们在所有平台或屏幕分辨率不同时看起来很糟糕原来的。

例如,如果你使用智能的布局组合,你的GUI就可以自行组装,更加灵活,如果您决定更改按钮的位置或添加新按钮。例如:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;

public class Calc2 extends JPanel {
   private static final String[][] INITIAL_BTNS = {
      {"1", "2", "3", "+"},
      {"4", "5", "6", "-"},
      {"7", "8", "9", "*"},
      {"C", "0", ".", "/"},
      {"1/x", "\u221A", "Ln", "="}
   };
   private static final String[][] EXTRA_BTNS = {
      {"sin", "cos", "tan"},
      {"csc", "sec", "cot"}
   };
   private static final int GAP = 5;

   private JTextField displayField = new JTextField(10);

   public Calc2() {
      int rows = INITIAL_BTNS.length;
      int cols = INITIAL_BTNS[0].length;
      JPanel initialBtnPanel = new JPanel(new GridLayout(rows, cols, GAP, GAP));
      rows = EXTRA_BTNS.length;
      cols = EXTRA_BTNS[0].length;
      JPanel extraBtnPanel = new JPanel(new GridLayout(rows, cols, GAP, GAP));

      JPanel combinedBtnPanel = new JPanel();
      combinedBtnPanel.setLayout(new BoxLayout(combinedBtnPanel, BoxLayout.PAGE_AXIS));
      combinedBtnPanel.add(initialBtnPanel);
      combinedBtnPanel.add(Box.createVerticalStrut(GAP));
      combinedBtnPanel.add(extraBtnPanel);

      for (int r = 0; r < INITIAL_BTNS.length; r++) {
         for (int c = 0; c < INITIAL_BTNS[r].length; c++) {
            JButton button = new JButton(INITIAL_BTNS[r][c]);
            initialBtnPanel.add(button);
            // add action here
         }
      }

      for (int r = 0; r < EXTRA_BTNS.length; r++) {
         for (int c = 0; c < EXTRA_BTNS[r].length; c++) {
            JButton button = new JButton(EXTRA_BTNS[r][c]);
            extraBtnPanel.add(button);
            // add action here
         }
      }

      setLayout(new BorderLayout(GAP, GAP));
      setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));

      add(displayField, BorderLayout.PAGE_START);
      add(combinedBtnPanel, BorderLayout.CENTER);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("Calculator");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new Calc2());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

显示为:

enter image description here

如果以后您决定在额外按钮部分的顶部添加3个按钮,那么您需要对我的代码添加一行代码(不计算所需的逻辑代码更改)对你和我来说都是一样的),并改变这个:

   private static final String[][] EXTRA_BTNS = {
      {"sin", "cos", "tan"},
      {"csc", "sec", "cot"}
   };

到此:

   private static final String[][] EXTRA_BTNS = {
      {"foo", "bar", "baz"},
      {"sin", "cos", "tan"},
      {"csc", "sec", "cot"}
   };

没有必要手动更改所有其他按钮的位置或手动重新调整JFrame的大小,因为布局管理器会为您处理此问题,GUI将显示为:

enter image description here