2016-05-26 8 views
0

Так что у меня есть это, чтобы преобразовать String из JTextField в int. Он говорит Exception in thread "main" java.lang.NumberFormatException: For input string: "". Пожалуйста помоги.Parsing JTextfield String в Integer

JTextField amountfld = new JTextField(15); 
gbc.gridx = 1; // Probably not affecting anything 
gbc.gridy = 3; // 
add(amountfld, gbc); 
String amountString = amountfld.getText(); 
int amount = Integer.parseInt(amountString); 
+2

использовать JFormattedTextField с номером форматера, больше в Oracle учебнике JSpinner правильно возможных ш ays тоже, также есть комбинации JTextField и DocumentFilter, все древовидные пути здесь много раз около – mKorbel

ответ

1

От docs:

Выдает: NumberFormatException - если строка не содержит оформленного целого числа.

пустая строка "" не интерпретируемое целое, так что ваш код всегда будет производить NumberFormatException, если значение не вводится.

Существует много способов избежать этого. Вы можете просто проверить, действительно ли значение String, полученное вами от amountField.getText(), заполнено. Вы можете создать пользовательский IntegerField, который позволяет вводить только целые числа, но добавляет Document к JTextField.Создание документа, чтобы только целые числа вход:

public static class IntegerDocument extends PlainDocument { 

    @Override 
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { 
     StringBuilder sb = new StringBuilder(str.length()); 
     for (char c:str.toCharArray()) { 
      if (!Character.isDigit(c)) { 
       sb.append(c); 
      } 
     } 
     super.insertString(offs, sb.toString(), a); 
    } 
} 

Теперь создать IntergerField с удобным getInt метод, который возвращает ноль, если ничего не введено:

public static class IntegerField extends JTextField { 
    public IntegerField(String txt) { 
     super(txt); 
     setDocument(new IntegerDocument()); 
    } 

    public int getInt() { 
     return this.getText().equals("") ? 0 : Integer.parseInt(this.getText());   
    } 
} 

Теперь вы можете получить целочисленное значение из amountField без выполнения каких-либо проверок:

JTextField amountField = new IntegerField("15"); 
... 
//amount will be zero if nothing is entered 
int amount = amountField.getInt(); 
+0

Большое спасибо –

1

Ваша самая большая проблема заключается в том, что вы разбираете содержимое текстового поля сразу после создания поля, и это не имеет смысла. Разве не было бы более целесообразным анализировать данные после, позволяя пользователю вводить данные, предпочтительно в каком-то слушателе, часто в ActionListener?

И поэтому мои рекомендации два раза

  1. Не пытайтесь извлечь данные сразу по созданию JTextField, но вместо того, чтобы сделать это в течение соответствующего слушателя. Тип может быть известен только вам, но часто мы используем ActionListeners для такого рода вещей, чтобы мы могли анализировать, когда пользователь нажимает JButton.
  2. Сделайте свой синтаксический анализ в блоке try/catch, где вы поймаете NumberFormatException. Если возникает исключение, вы затем очищаете JTextField, вызывая setText(), а затем предупреждаете пользователя о том, что они вводят неверные данные, часто выполняемые с помощью JOptionPane.
  3. OK 3-я рекомендация: если возможно, попробуйте сделать ваш GUI полностью идиот-доказательством на 1), указав пользователю значение по умолчанию и 2) даже не позволяя пользователю вводить неверные данные. JSlicer или JSpinner или JComobBox могут работать хорошо для этого, поскольку они ограничивают допустимый ввод.

Например:

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

@SuppressWarnings("serial") 
public class GetNumericData extends JPanel { 
    private JTextField amountfld = new JTextField(15); 
    private JSpinner amountSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 40, 1)); 
    private JButton submitButton = new JButton(new SubmitAction("Submit")); 
    private JButton exitButton = new JButton(new ExitAction("Exit", KeyEvent.VK_X)); 

    public GetNumericData() { 
     add(new JLabel("Amount 1:")); 
     add(amountfld); 
     add(new JLabel("Amount 2: $")); 
     add(amountSpinner); 
     add(submitButton); 
     add(exitButton); 
    } 

    // do all your parsing within a listener such as this ActionListener 
    private class SubmitAction extends AbstractAction { 
     public SubmitAction(String name) { 
      super(name); 
      int mnemonic = (int) name.charAt(0); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String amountTxt = amountfld.getText().trim(); 
      try { 
       int amount1 = Integer.parseInt(amountTxt); 
       // if this parse fails we go immediately to the catch block 

       int amount2 = (Integer) amountSpinner.getValue(); 
       String message = String.format("Your two amounts are %d and %d", amount1, amount2); 
       String title = "Amounts"; 
       int messageType = JOptionPane.INFORMATION_MESSAGE; 
       JOptionPane.showMessageDialog(GetNumericData.this, message, title, messageType); 

      } catch (NumberFormatException e1) { 
       String message = "You can only enter numeric data within the amount field"; 
       String title = "Invalid Data Entered"; 
       int messageType = JOptionPane.ERROR_MESSAGE; 
       JOptionPane.showMessageDialog(GetNumericData.this, message, title, messageType); 
       amountfld.setText(""); 
      } 
     } 
    } 

    private class ExitAction extends AbstractAction { 

     public ExitAction(String name, int mnemonic) { 
      super(name); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.exit(0); 
     } 
    } 

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

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

Спасибо за ответ –

+0

@AshfordTulgaa Нет проблемы, обновил мой ответ для наглядности – Ian2thedv