Java - 无法使jTextArea中的getText正常工作

时间:2011-07-05 13:16:02

标签: java swing arraylist jtextarea

我有一个单独的JFrame,其中有一个文本框(jTextArea),它将数字作为输入,每个都用新行分隔。在使用文本框关闭JFrame时,数据应该存储在整数的ArrayList中。单击主JFrame中的按钮时会检查ArrayList,如果发生错误则会记录错误。

jTextArea的JFrame代码如下所示:

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 个答案:

答案 0 :(得分:3)

阅读api doc of getText(int, int):第二个参数不是偏移量。这是一个长度。

附注1:应该更容易将所有文本作为单个字符串并在新行字符上拆分,并将每个字符串解析为整数。

附注2:测试if (jTextArea1.equals(""))无法成功。 JTextArea实例永远不会等于String实例。

答案 1 :(得分:2)

我没有检查完整的程序,但这是错误的:

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

您是否忘记添加getText()的来电?因为JTextArea的实例对象永远不等于true"",所以该行将始终计算为null。后者意味着jTextArea1对象本身为null。当你调用equals方法时,会给你一个NPE。

答案 2 :(得分:1)

在检查条件之前是否重置了标志?考虑以下情况:

   //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)