Java - Не удается получить getText в jTextArea для правильной работы - PullRequest
0 голосов
/ 05 июля 2011

У меня есть отдельный JFrame, где есть текстовое поле (jTextArea), которое принимает числа в качестве входных данных, каждое из которых разделено новой строкой.После закрытия JFrame с текстовым полем данные должны храниться в ArrayList целых чисел.ArrayList проверяется при нажатии кнопки в главном JFrame, и ошибки регистрируются, если они происходят.

Код для JFrame с jTextArea выглядит следующим образом:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        boolean success = false;
        try{
            selectedTime = Long.parseLong(jTextField1.getText());
            if(selectedTime >= 10000){
                success = true;
                if(!jTextArea1.equals("") && !jTextArea1.equals(null)){
                    try{
                        for(int i = 0; i < jTextArea1.getLineCount(); i++){
                            n = Integer.parseInt(jTextArea1.getText(jTextArea1.getLineStartOffset(i),jTextArea1.getLineEndOffset(i)));
                            if(n <= 172){
                                worldsChosen.add(n);
                            }
                        }
                    }catch(Exception e){
                        errorsHappened = true;
                    }
                }
            }else{
                javax.swing.JOptionPane.showMessageDialog(null,"The specified time was not above or equal to 10000 ms. Please try again.");
                success = false;
            }
        }catch(Exception e){
            javax.swing.JOptionPane.showMessageDialog(null,"The specified time was not set in numbers exclusively. Please try again.");
            success = false;
        }
        if(success){
            gui.hideWorlds();
        }
    }

Примечание: этотакже проверяет, есть ли в текстовом поле ввод числа, равный или превышающий 10000 (это работает).

Код для основного JFrame:

 if(jCheckBox5.isSelected()){
            checkWorld = true;
            if(!worldsChosen.isEmpty()){
                changeWorlds = true;
            }else{
                log("You've selected the option for automatic world switching,");
                log("but all of your inputs weren't formatted correctly.");
                errorsHappened = true;
            }
        }else{
            errorsHappened = false;
        }
if(errorsHappened == true){
                log("One or multiple worlds weren't added due to incorrect formatting.");
                log("Retry to make script automatically change worlds.");               
            }

Всякий раз, когда я запускаю скрипт с проверкойфлажок и что-то правильно отформатировано в текстовой области (как это):

1
2
3
4
5

и т. д.

Выводит все сообщения журнала (как будто флажок был установлен, но ни одинвходные данные были отформатированы правильно).

Я старался изо всех сил, чтобы исправить это, но я просто не вижу, как это все испортило.

Любая помощь приветствуется:).

Майк Хэй.

Ответы [ 3 ]

3 голосов
/ 05 июля 2011

Чтение API-интерфейса getText (int, int) : второй аргумент не является смещением. Это длина.

Примечание 1: вероятно, должно быть проще получить весь текст в виде одной строки и разбить его на символы новой строки, а также проанализировать каждую строку в целое число.

Примечание 2: Тест if (jTextArea1.equals("")) не может быть успешным. Экземпляр JTextArea никогда не будет равен экземпляру String.

2 голосов
/ 05 июля 2011

Я не проверил всю программу, но это неправильно:

if(!jTextArea1.equals("") && !jTextArea1.equals(null)){

Вы забыли добавить вызов getText()? Строка в том виде, в каком она есть, всегда будет оцениваться как true, поскольку объект экземпляра JTextArea никогда не будет равен "" или null. Последнее подразумевает, что объект jTextArea1 сам по себе равен нулю. Что даст вам NPE при вызове метода equals.

1 голос
/ 05 июля 2011

Сбрасываете ли вы флажок перед проверкой условий?Рассмотрим следующий случай:

   //suppose errorsHappened is true here 
   if(jCheckBox5.isSelected()){ //we get true here
        checkWorld = true;
        if(!worldsChosen.isEmpty()){ //not empty, so this branch is taken
            changeWorlds = true;
        }else{ //worldsChosen is not empty, so this would not be logged
            log("You've selected the option for automatic world switching,");
            log("but all of your inputs weren't formatted correctly.");
            errorsHappened = true;
        }
    }else{ //checkbox is selected, so no reset to false here
        errorsHappened = false;
    }
   //due to the checkbox being selected and worldsChosen not being empty, 
   //errorsHappend is still true (which is wrong)
...