【问题标题】:NumberFormatException: empty string when clicking the JButton?NumberFormatException:单击 JButton 时出现空字符串?
【发布时间】:2014-01-21 03:32:38
【问题描述】:

我制作了一个程序,它有一个 JFrame,其中包含一个 JTextField、一个按钮和两个 JLabel。当在 JTextField 中输入一个数字时,按下回车键或单击 JButton 应该在第二个 JLabel 上以科学计数法显示数字。当我按回车键时,它可以工作,但是,当我单击 JButton 时,它不会。它给了我一个 NumberFormatException: empty string。

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

public class MyMath extends JPanel implements ActionListener
{
   private JTextField textField;
   private static JLabel textArea;
   private static JLabel comment;
   private JButton button;
   private static JFrame frame;

public MyMath()
{
    comment = new JLabel("Enter a number");
    textField = new JTextField();
    textField.setSize(new Dimension(10 , 10));
    textField.addActionListener(this);
    button = new JButton("Go");
    button.addActionListener(this);
}

    public static void addComponentsToPane(Container pane) 
    {

    textArea = new JLabel(" ");
    pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
    pane.add(new MyMath().textField);
    pane.add(new MyMath().button);
    pane.add(new MyMath().comment);
    pane.add(textArea);
}

public void actionPerformed(ActionEvent evt) 
{
    String text = textField.getText();
    textArea.setText(SciNotation.convertToSciNotation(text));
    textArea.setHorizontalAlignment(SwingConstants.CENTER);
    comment.setText(text + " in Scientific Notation:");
    textField.selectAll();
}

private static void createAndShowGUI() 
{  
    frame = new JFrame("Scientific Notation");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addComponentsToPane(frame.getContentPane());
    Container bg = frame.getContentPane();
    Dimension d = new Dimension(300, 150);   
    bg.setPreferredSize(d);
    frame.setResizable(false);
    frame.getContentPane().setBackground(Color.GREEN);
    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
    Point screenCenter = new Point (screen.width/2 , screen.height/2);
    Point center = new Point(screenCenter.x - (150), screenCenter.y - (75));
    frame.setLocation(center);
    frame.pack();
    frame.setVisible(true);
}

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

这里是 SciNotation.java

    import java.awt.Component;
    import java.awt.font.TextAttribute;
    import java.text.AttributedString;

public class SciNotation
{
  public static String convertToSciNotation(String num)
  {
    num = num.replaceAll("," , "");
    if (num.contains("E"))                    //not working
    {
        String[] partsE = num.split("E"); 
        String beforeE = partsE[0];
        String afterE = partsE[1];
        char first = num.charAt(0);
        num = first + beforeE;
    }

    double number = Double.parseDouble(num);
    double resultNumber = 0;
    int power = 0;
    String numString = Double.toString(number); 
    String[] parts = numString.split("\\.");
    String decimals = parts[1];
    int decimalInt = Integer.parseInt(decimals);
    int numberInt = (int) number;

    if(number > -1 && number < 1)
    {
        String[] low = numString.split("\\.");
        String afterLow = low[1];
        for(int i = 1; i < 10; i++)
        {
            String decNums = Integer.toString(i);
            afterLow = afterLow.replaceAll(decNums, "");
            int zeros  = afterLow.length();
            power = -1 * (zeros + 1);
            resultNumber = number * Math.pow(10, zeros + 1);  
            decimals = "";
        }
    }

    if(decimalInt == 0)
    {
        decimals = "";
    }

    if( number >= 10)
    {
        power = Integer.toString(numberInt).length() - 1;   
        resultNumber =  numberInt/(Math.pow(10,(power)));
    }

    if((number >= 1 && number < 10) || (number <= -1 && number > -10))
    {
        resultNumber = number;
        decimals = "";
    }

    if(number <= -10)
    {
        power = Integer.toString(numberInt).length() - 2;
        resultNumber =  numberInt/(Math.pow(10,(power)));
    }

    return resultNumber + decimals + " x 10^" + power;

}
 }

【问题讨论】:

  • 请为您的异常发布堆栈跟踪。在黑暗中拍摄,检查 Double.parseNumber。它可能试图解析一个无法解析为双精度的字符串。
  • 使用JSpinner 代替JTextField,如here 所示。为了尽快获得更好的帮助,请发布MCVE(如链接答案中所示)。它不需要那么短,但它应该是一个源文件,并且只包含一个文本字段或微调器、一个按钮,可能还有一个显示结果的标签。

标签: java swing double jtextfield


【解决方案1】:

这个错误非常棘手。您构建了三个 MyMath 实例。因此,您的代码对 JTextFiled 实例的引用错误。这就是您无法获得正确输入的原因。

public static void addComponentsToPane(Container pane) {

    textArea = new JLabel(" ");
    pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
    pane.add(new MyMath().textField);  //MyMath instance 1
    pane.add(new MyMath().button);  //MyMath instance 2
    pane.add(new MyMath().comment);  //MyMath instance 3
    pane.add(textArea);
}

这是正确的代码:

public static void addComponentsToPane(Container pane) {

        MyMath myMath = new MyMath();

        textArea = new JLabel(" ");
        pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
        pane.add(myMath.textField);
        pane.add(myMath.button);
        pane.add(myMath.comment);
        pane.add(textArea);
    }

:)

【讨论】:

  • @user3217494:不客气。不要忘记接受我的回答。 :P
猜你喜欢
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
相关资源
最近更新 更多