0

我正在为学校完成一个 java 项目,但我被困在某个点上。

任务是制作一个任务计划器,它应该能够保存您添加/编辑或删除的任务,并将该信息保存在计算机目录中的文本文件中。

这样每次打开应用程序时,保存的任务信息都会加载到 GUI 中。

我面临的问题是我必须在 GUI 的某些文本字段中插入信息(加载时)......但有时并非所有文本字段都应该完成 - 换句话说,这不是强制性的 -

这就是为什么有时 .setText() 方法会有一个空参数并且代码不起作用的原因......

我尝试通过在每次检测到空参数时插入一个“”(空格)来解决这个问题 - 但我发现这个解决方案很难看,因为它适用于当点击一个带有新的空 TextField 的新 GUI 窗口时,会自动出现一个空格和用户在写东西之前应该按退格键......

有没有更好的解决方案?

这是加载所有任务的代码......

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

 public class ReadTask extends Planner {

    public static void read(){

        String[] myArray = new String[8];
        String line = "";

        TaskWindowNew currentTask = null;

        try 
        {
            BufferedReader br = new BufferedReader(new FileReader("PlannerText.txt"));          

            while (( line = br.readLine()) !=null) 
            {
                myArray = line.split("\\|");

                for(int i=0;i<myArray.length;i++)
                {
                    if( myArray[i].isEmpty())
                    {
                        myArray[i] = "yoooo";
                    }
                }

                System.out.println(myArray.toString());

                try{
                    currentTask = new TaskWindowNew();
                    currentTask.popupFrame.setVisible(false);

                    // IMPORTANT = If one or more field(s) is left empty the .doClick function will not work
                    // we need to find a solution for this.
                    currentTask.titleField.setText(myArray[1]);
                    currentTask.minuteField.setText(myArray[2]);
                    currentTask.hourField.setText(myArray[3]);
                    currentTask.daysMonthField.setText(myArray[4]);
                    currentTask.MonthField.setText(myArray[5]);
                    currentTask.daysWeekField.setText(myArray[6]);
                    currentTask.specialSymbolField.setText(myArray[7]);

                    //this emulates the action of the OK-button in the new task window !
                    currentTask.buttonOk.doClick();

                 } catch (ArrayIndexOutOfBoundsException e)
                 {

                 }
            }

            br.close(); 

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        updateScrollPanel();


    }

}
4

2 回答 2

0

您所做的将其与文件内容紧密耦合。意味着在数组索引 1 处将有一个标题字段或在索引 3 处有一个小时字段。但如果用户没有输入任何值,则索引会更改,您可能会得到 ArrayIndexOutOfBoundsException在某些情况下。

因此,当用户没有输入非必填字段时,您不能期望下次在 UI 上显示它们。

您应该做的是将键值对存储在文件中。这将使您能够检查哪个字段的值,而不是依赖于数组索引。

我的意思是这样的:

职称:先生

小时:四

特殊符号:#

然后,当您预填充它时,您应该获取每一行,拆分键和值,如果值不为空,则将其设置在 TaskWindowNew 的适当变量(您将从键中知道)中。

希望这可以帮助。

于 2013-05-14T21:58:18.903 回答
0

谢谢大家的回复/评论

我通过擦除 myArray 并将 .split 结果直接分配给数组来解决了这个问题。我不知道为什么它会这样工作......

对于那些对我的 SaveTask 类感兴趣的人,我会像这样保存数据

outputStream.println(order + "|"+ title +"|"+ minutes +"|"+ hours +"|"+ daysPerMonth +"|"+ months +"|"+ daysPerWeek +"|"+ specialSymbol +"|"+"end");
order++;

但是如果没有最后的“结束”标志,下面的代码将无法工作......否则它不会使数组有 8 个槽长,它只会让它与最后一个填充的 TextField 一样长......(其中给了我 ArrayIndexOutOfBoundsException 问题)

所以这就是我修复它的方式。

我认为@skandigraun 很困惑,因为 StringTokenizer 实际上做了相反的事情(我相信)

见这里: http: //www.coderanch.com/t/446893/java/java/Difference-split-StringTokenizer-nextToken

和有效的代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

 public class ReadTask extends Planner {

    public static void read()
    {

        //try-catch for IOExceptions
        try 
        {
            //Make the inputStream
            BufferedReader br = new BufferedReader(new FileReader("PlannerText.txt"));

            //The String containing each line
            String line = null;

            //For each line do the following
            while ( (line = br.readLine()) !=null) 
            {               
                //Make a new Task-window
                TaskWindowNew currentTask = new TaskWindowNew();

                //Set visibility to false
                currentTask.popupFrame.setVisible(false);

                //An array containing each string seperated by the delimiter
                String[] currTask = line.split("\\|");

                System.out.println(currTask.length);

                System.out.println(currTask[0]);

                //Fill each field with the corresponding String
                currentTask.titleField.setText(currTask[1]);
                currentTask.minuteField.setText(currTask[2]);
                currentTask.hourField.setText(currTask[3]);
                currentTask.daysMonthField.setText(currTask[4]);
                currentTask.MonthField.setText(currTask[5]);
                currentTask.daysWeekField.setText(currTask[6]);
                currentTask.specialSymbolField.setText(currTask[7]);

                //this emulates the action of the OK-button in the new task window !
                currentTask.buttonOk.doClick();
            }

            //Close the stream
            br.close(); 

        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }

        updateScrollPanel();            
    }
}
于 2013-05-15T16:05:10.687 回答