无法从JTextField获取整数

时间:2017-09-06 23:12:13

标签: java swing

我试图从JTextField获取一个整数,但我不断获得NumberFormatException。我使用下面的代码:

JTextField price = new JTextField();
price.addActionListener(new ComboListener());
String inputText = price.getText();
int inputPrice = Integer.parseInt(inputText);

每个网站都说这是正确的做法,所以我不明白我做错了什么。

编辑:完整代码在这里:

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

public class RatePanel extends JPanel {

    private double[] rate; // exchange rates
    private String[] currencyName;
    private JLabel result;

    public RatePanel() {
        currencyName = new String[]{"Select the currency..",
            "European Euro", "Canadian Dollar",
            "Japanese Yen", "Australian Dollar",
            "Indian Rupee", "Mexican Peso"};

        rate = new double[]{0.0, 1.2103, 0.7351,
            0.0091, 0.6969, 0.0222, 0.0880};

        JLabel title = new JLabel("How much is that in dollars?");
        title.setAlignmentX(Component.CENTER_ALIGNMENT);
        title.setFont(new Font("Helvetica", Font.BOLD, 20));
        add(title);
        add(Box.createRigidArea(new Dimension(0, 100)));
        JLabel enter = new JLabel("Enter cost of item");
        enter.setAlignmentX(Component.LEFT_ALIGNMENT);
        enter.setFont(new Font("Helvetica", Font.BOLD, 20));
        add(enter);
        JTextField price = new JTextField();
        price.addActionListener(new BoxListener());
        price.setAlignmentX(Component.RIGHT_ALIGNMENT);
        add(price);
        add(Box.createRigidArea(new Dimension(0, 100)));
        JLabel select = new JLabel("Select a currency: ");
        select.setAlignmentX(Component.LEFT_ALIGNMENT);
        select.setFont(new Font("Helvetica", Font.BOLD, 20));
        add(select);
        JComboBox Cbox = new JComboBox(currencyName);
        Cbox.addActionListener(new ComboListener());
        Cbox.setAlignmentX(Component.RIGHT_ALIGNMENT);
        add(Cbox);
        String index = Cbox.getSelectedItem().toString();
    }

    public class BoxListener implements ActionListener {

        public void actionPerformed(ActionEvent event) {
            String inputText = price.getText();
            int inputPrice = Integer.parseInt(inputText);
        }
    }

    public class ComboListener implements ActionListener {

        public void actionPerformed(ActionEvent event, String index, double inputPrice, double[] rate) {
            double finalPrice = 0;
            switch (index) {
                case "European Euro":
                    finalPrice = inputPrice * rate[1];
                    break;
                case "Canadian Dollar":
                    finalPrice = inputPrice * rate[2];
                    break;
                case "Japanese Yen":
                    finalPrice = inputPrice * rate[3];
                    break;
                case "Australian Dollar":
                    finalPrice = inputPrice * rate[4];
                    break;
                case "Indian Rupee":
                    finalPrice = inputPrice * rate[5];
                    break;
                case "Mexican Peso":
                    finalPrice = inputPrice * rate[6];
                    break;
            }

            result = new JLabel(inputPrice + "USD equals " + finalPrice
                    + index);
            add(result);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }
}

4 个答案:

答案 0 :(得分:0)

  

当我尝试在actionListener方法中定义它时,它告诉我它   找不到教科书

这可能是因为您在创建它的方法中将'price'定义为局部变量。您的“价格”变量应该是一个对您班级中所有方法都可见的实例变量。

答案 1 :(得分:0)

首先,写入的代码尝试在创建文本字段之后立即访问文本,然后用户输入任何内容。访问文本的代码应该在动作侦听器中。如果ComboListener是您创建的类,那么最后两行应该在其actionPerformed方法中;如果这样做,请确保price变量是实例变量或静态变量(即,在方法定义之外 - 是否使其静态以及将其放入哪个类取决于其余的你的代码是结构化的。)

另一种方法是使用匿名内部类,如下所示:

// the 'final' modifier is necessary for anonymous inner classes
// access local variables
final JTextField price = new JTextField();
price.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        String inputText = price.getText();
        // do the conversion and other processing here...
    }
});

(我相信Java的新版本可以缩写为

price.addActionListener((ActionEvent e) -> {
    String inputText = price.getText();
    // do the conversion and other processing here...
});

但我对此并不是100%肯定。)

其次,请记住,如果您使用parseInt,它只会接受整数值;像12.34(带小数点)之类的东西会导致错误。解决此问题的最简单方法是使用Double.parseDouble,尽管使用价格double会导致舍入错误,因此这不是最好的方法。此外,请确保您不要在框中放置$£或其他任何内容;这也可能导致错误。

答案 2 :(得分:0)

您正在创建JTextField后立即阅读它。此时,它是空的空字符串,这不是有效数字。

当用户按Enter或其他内容时,您应该将该代码放在侦听器中。而且,另外,尝试对用户友好并显示错误消息而不是抛出异常。

答案 3 :(得分:0)

我运行了你的代码,它实际上运行正常(没有给我NumberFormatException)。

你得到NumberFormatException可能是因为你尝试了以下内容:

  1. 当字段为空时,在文本字段上按 Enter
  2. 当字段包含非数字输入时,在文本字段上按 Enter
  3. 在尝试将文本字段的内容解析为整数之前,您可以在输入中添加验证:

    public class BoxListener implements ActionListener {
    
        public void actionPerformed(ActionEvent event) {
            String s= price.getText();
            if(s.matches("[0-9]+"))               //Perform validation before parsing string
                inputPrice = Integer.parseInt(s);
        }
    }
    

    另请注意,我不是将inputPrice和您的其他组件(例如文本字段)声明为局部变量,而是将它们声明为RatePanel的实例变量。

    将变量声明为实例变量而不是局部变量:

    class RatePanel extends JPanel{
        private JTextfield txtPrice;   // <--- declare here as instance variable
        private int inputPrice;        // <--- declare here as instance variable
    
        public RatePanel(){
            //If you declare in the constructor or other methods, they become local variables.
        }
    }