我有一个单独的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
等
它输出所有日志消息(好像选中了复选框但没有输入格式正确)。
我尽我所知来解决这个问题,但我看不出它是如何混淆的。
任何帮助表示赞赏:)。
迈克海耶。答案 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)