2015-12-12 3 views
0

У меня есть диалоговое окно, которое создает себя и должно проверять вход пользователя. На данный момент я могу заставить его проверить пустой ввод и правильно разобрать вход пользователя, когда он является Integer, однако я продолжаю получать NumberFormatException при проверке с помощью String. Добавление попытки, catch остановило JVM от сбоя, но входной сигнал затем был нулевым.Подтвердить ввод до нажатия кнопки в Java

public void initDialog() { 
    dPanel = new JPanel(); 
    dPanel.setLayout(new BoxLayout(dPanel, BoxLayout.Y_AXIS)); 
    JLabel invalidInput = new JLabel(""); 
    String[] options = {"OK"}; 
    dPanel.add(new JLabel("Game default target is 101, enter a number below to change it")); 
    dPanel.add(new JLabel("Leave blank to start with the default")); 
    dPanel.add(invalidInput); 
    JTextField text = new JTextField(""); 
    text.requestFocusInWindow(); 
    dPanel.add(text); 

    int changeGameTarget = JOptionPane.showOptionDialog(null, dPanel, "Dice Game", JOptionPane.NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); 

    dialogHandler(changeGameTarget, text, invalidInput); 

    text.setText(""); 
} 

Диалог метод обработки

public boolean dialogHandler(int op, JTextField text, JLabel nonDigit) { 

    String s = text.getText(); 

    try { 
     if (op == JOptionPane.OK_OPTION) { 
      if (s.isEmpty()) { 
       target = 101; 
      } else { 
       target = Integer.parseInt(s); 
      } 
     } 
    } catch (NumberFormatException ex){ 
     nonDigit.setText("This is not a number"); 
     return false; 
    } 

    return true; 
} 
+0

так, когда вход не integeter, вы хотите, чтобы пользователю ввести что-то другое? – PKlumpp

+0

Да, я хочу, чтобы пользователь должен был ввести ввод, который является действительным – W1492046

ответ

1

Давайте использовать Try-Catch в разборе как если-иначе и изменения метода булева, так что вы можете сделать петлю в главном.

public boolean dialogHandler(int op, JTextField text, JLabel nonDigit) { 

    String s = text.getText(); 

    if (op == JOptionPane.OK_OPTION) { 
    if (s.isEmpty()) { 
     return false; // If the text is empty we return false for the flag. 
    } else { 
     try { 
     target = Integer.parseInt(s); 
     return true; // If parse was succesful, we return true for the flag. 
     } catch (Exception e) { 
     return false; // If the exception happened, return false for the flag. 
     } 
    } 
    } else if (op == JOptionPane.CLOSED_OPTION) { 
    System.exit(0); 
    } 
} 

Тогда мы изменяем основные:

boolean flag; 
do { 
    int changeGameTarget = JOptionPane.showOptionDialog(null, dPanel, "Dice Game", JOptionPane.NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); 
    flag = dialogHandler(changeGameTarget, text, invalidInput); 
} while (!flag); 
+0

Ваш основной метод редактирования не может увидеть changeGameTarget, пока он находится в int – W1492046

+0

Можете ли вы попробовать поместить его в переменную и попробовать еще раз? Я отредактирую. –

+0

Это прекрасно работает, надеюсь, вы не против, но я только что отредактировал ваш код, чтобы он работал :) – W1492046

0

Удовлетворительный решении вашей проблемы должно быть довольно просто:

Во-первых, изменить метод подписи

public boolean dialogHandler(int op, JTextField text, JLabel nonDigit)

Это позволяет для возврата, вход был хорошим (true) или плохо (false). Затем вы просто окружаете свой метод блоком try-catch и поймаете NumberFormatException. В случае обнаружения Исключения, возвратите false, в противном случае возвратите true.

Тогда вам нужно только написать, что, когда результат метода ложный, пользователь должен ввести что-то еще.

+0

Можете ли вы привести пример, как я могу снова ввести пользователя? Я обновляю свой вопрос с помощью логического метода signatrure – W1492046

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