2014-10-06 37 views
-2

我很确定我已经看过大多数与此问题有关的问题,但他们都使用多个文本字段,每个按钮一个侦听器或类似的东西。我试图从一个文本字段获取多个双输入,第一个变量设置为初始文本,第二个变量设置为第二个文本。所以如果有人输入1 + 4,第一个变量设置为1,+清除文本字段,第二个变量设置为4.这是第一次写入,所以可能会有很多不必要的事情。从一个JTextField解析多个双打

编辑:可能在这里不清楚,我想要发生的是用户输入(对于1 + 4),单击按钮1将文本字段设置为1并将第一个变量设置为1,然后单击+按钮,清除文本字段,然后单击4按钮将文本字段设置为4并将第二个变量设置为4,然后单击等号按钮,结果基于操作员单击。它不是作为一个字符串输入的。

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

class GUICalculator extends JFrame implements ActionListener { 

    private static final int WIDTH = 300; 
    private static final int HEIGHT = 300; 
    private JTextField displayField; 
    private static final String[] NUMBERS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "-", "*", "/", "C", "=", "."}; 
    private static final Set<String> OPERATORS = new HashSet<>(Arrays.asList("+", "-", "*", "/", "C", "=")); 
    private double n1, n2, result; 

    public GUICalculator() { 
     super("Calculator"); 
     setLayout(new BorderLayout()); 
     setSize(WIDTH, HEIGHT); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new FlowLayout()); 
     displayField = new JTextField(); 
     displayField.setEditable(false); 
     add(displayField, BorderLayout.NORTH); 
     add(buttonPanel); 

     for (String number : NUMBERS) { 
      JButton buttons = new JButton(number); 
      buttons.addActionListener(this); 
      buttonPanel.add(buttons); 
     } 
    } 

    public void actionPerformed(ActionEvent e) { 
     String command = e.getActionCommand(); 

     for (String number : NUMBERS) { 
      if (command.equals(number) && !OPERATORS.contains(command)) { 
       displayField.setText(displayField.getText() + command); 
       n1 = Double.parseDouble(displayField.getText()); 
      } 

      //n2 = Double.parseDouble(displayField.getText()); 

      switch (command) { 
       case "+": 
        result = n1 + n2; 
        displayField.setText(""); 
       case "-": 
        result = n1 - n2; 
        displayField.setText(""); 
       case "*": 
        result = n1 * n2; 
        displayField.setText(""); 
       case "/": 
        try { 
         if (n2 == 0) 
          throw new DivisionByZeroException(); 
         result = n1/n2; 
        } catch (DivisionByZeroException f) { 
         f.getMessage(); 
         displayField.setText(""); 
         break; 
        } 
       case "=": 
        displayField.setText(Double.toString(result)); 
        break; 
       case "C": 
        displayField.setText(""); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     GUICalculator gc = new GUICalculator(); 
     gc.setVisible(true); 
    } 
} 

注释行是我想要进去的,但我不知道该把它放在哪里。

+0

请参见[此答案](http://stackoverflow.com/a/7441804/418556)工作源使用['ScriptEngine'](http://docs.oracle.com/javase/8/docs/ api/javax/script/ScriptEngine.html)来评估表达式。 – 2014-10-06 07:36:03

回答

1

问题是,Double.parseDouble试图解析整个字符串,而您试图读取字符串作为一组标记。这需要实现一个表达式分析器。你的代码看起来有点像解析器,但需要一种标记字符串的方法。

你可以看看解释如this tutorial

一个额外的评论:请终止您的case代码块与break -statement。如果您的代码与+匹配,则它将执行所有cases中的操作。因此,编写1 + 2仍然会产生1/2的结果,并执行=的操作,因为case确实有break语句。欲了解更多信息,请参阅Oracle info on the switch statement