2013-02-14 2 views
-2

У меня есть эти два класса, которые делают простой калькулятор, однако, когда я пытаюсь использовать его я получаю java.lang.NumberFormatException ошибки, вот исходный код:Почему этот метод возвращает пустую строку?

Из класса SimpleCalc:

//Imports are listed in full to show what's being used 
//could just import javax.swing.* and java.awt.* etc.. 

import java.awt.GridLayout; 
import java.awt.BorderLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.Container; 

public class SimpleCalc implements ActionListener{ 

    public static final SimpleCalc instance = new SimpleCalc(); 

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

    //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 SimpleCalc() 
    { 
     guiFrame = new JFrame(); 

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

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

     numberCalc = new JTextField(); 
     numberCalc.setHorizontalAlignment(JTextField.RIGHT); 
     numberCalc.setEditable(false); 

     guiFrame.add(numberCalc, BorderLayout.NORTH); 

     buttonPanel = new JPanel(); 

     //Make a Grid that has three rows and four columns 
     buttonPanel.setLayout(new GridLayout(4,3)); 
     guiFrame.add(buttonPanel, BorderLayout.CENTER); 

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

     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() 
     { 
      @Override 
      public void actionPerformed(ActionEvent event) 
      { 
       if (!numberCalc.getText().isEmpty()) 
       { 
        int number = Integer.parseInt(numberCalc.getText()); 
        if (calcOperation == 1) 
        { 
         int calculate = currentCalc + number; 
         numberCalc.setText(Integer.toString(calculate)); 
        } 
        else if (calcOperation == 2) 
        { 
         int calculate = currentCalc - number; 
         numberCalc.setText(Integer.toString(calculate)); 
        } 
       } 
      } 
     }); 

     buttonPanel.add(addButton); 
     buttonPanel.add(subButton); 
     buttonPanel.add(equalsButton); 
     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); 
    } 

    //As all the buttons are doing the same thing it's 
    //easier to make the class implement the ActionListener 
    //interface and control the button clicks from one place 
    @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);  
    } 

    public String getText() { 
     return numberCalc.getText(); 
    } 

} 

а вот другой класс OperatorAction:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JTextField; 

    public class OperatorAction implements ActionListener 
    { 
     int calcOperation = 0; 
     int currentCalc; 
     private int operator; 
     // How to make 


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

     public void actionPerformed(ActionEvent event) 
     { 
      currentCalc = Integer.parseInt(SimpleCalc.instance.getText()); 
      calcOperation = operator; 
     } 
    } 

Так что я получить, что это мой метод GetText, что не удается, но почему? Я действительно не могу понять, почему это не должно работать:/

+0

Можете ли вы разместить точное сообщение (которое содержит всю необходимую информацию)? – assylias

+0

Это должно быть закрыто как слишком локализованное. – djechlin

+0

Вам нужно найти проблему, которая у вас более универсальная, чем то, что в вашем коде. Начните с обрезки всего кода, который не имеет отношения к вашей проблеме, найдите минимальный пример, из которого он может быть воспроизведен, оттуда, если у вас нет ответа, отредактируйте этот вопрос или напишите более ранний. – djechlin

ответ

0

Просто измените свой класс действий к этому:

public class OperatorAction implements ActionListener 
{ 
    int calcOperation = 0; 
    int currentCalc; 
    private int operator; 
    // How to make 


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

    public void actionPerformed(ActionEvent event) 
    { 
     String text = SimpleCalc.instance.getText(); 
     try { 
      currentCalc = Integer.parseInt(text); 
     } catch (NumberFormatException e) { 
      currentCalc = 0; 
     } 
     calcOperation = operator; 
    } 
} 

В качестве альтернативы, если вы точно знаете, что никто не ставит ничего, кроме номера на SimpleCalc.instance, вы можете только проверка на нулевое значение.

public class OperatorAction implements ActionListener 
{ 
    int calcOperation = 0; 
    int currentCalc; 
    private int operator; 
    // How to make 


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

    public void actionPerformed(ActionEvent event) 
    { 
     String text = SimpleCalc.instance.getText(); 
     currentCalc = text != null ? Integer.parseInt(text) : 0; 
     calcOperation = operator; 
    } 
} 

помнить также, что ни одно из решений не идеально подходят для хорошей архитектуры, поскольку они опираются на ненадежный источник информации для этих чисел, но это должно решить конкретную проблему вы спрашиваете.

Для хорошего решения вам необходимо переконфигурировать все решение, но я думаю, что ваше задание не требует этого.

Смежные вопросы