1

我在创建具有我想要的名称的文本文件时遇到问题。

我想创建一个名为:'username' Subjects 的文本文件。

 private void saveSubjects(){

    RegisterFrame r = new RegisterFrame();


    String username = r.txtUser.getText();;

    try{
        FileWriter f = new FileWriter(username + "" + "Subjects" + ".txt", true);

        String subjects[] = lstSubjects.getItems();

        for(int i = 0; i<subjects.length; i++){
            f.write(subjects[i] + "\r\n");
        }
        f.close();
        JOptionPane.showMessageDialog(null, "Data saved!", "Data Saved", JOptionPane.INFORMATION_MESSAGE);
    }catch(Exception e){
        JOptionPane.showMessageDialog(null, "Nothing Inputted!", "Error", JOptionPane.ERROR_MESSAGE);
    }

}

我想从 RegisterFrame 获取用户名,因为它是在那里输入的,但它不起作用。我知道这是一件简单的事情,但我仍然是这方面的初学者。我该如何解决这个问题?

提前致谢

4

3 回答 3

2

尝试这个:

String username = r.txtUser.getText();
System.out.println("The loaded username is: " + username);

然后您将看到问题出在哪里:写入文件或获取用户名文本。

如果问题在于获取文本,请考虑其他获取文本的方式或通过删除文件写入部分并指定用户名获取部分来修改问题。

否则,IDK 哪里出错了。

顺便说一句:它怎么不起作用?该文件根本没有创建?你看到任何错误吗?文件名称错误?请明确说明

于 2012-09-12T15:17:00.560 回答
0

您编写文件的代码似乎很好。根据您的代码,我尝试了这个,效果很好:

public static void main(String[] args) {

    FileWriter f = null;
    try {
        f = new FileWriter("Subjects.txt", true);

        String subjects[] = {"subject1", "subject2"};

        for (String subject : subjects) {
            f.write(subject + "\r\n");
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        IOUtils.closeQuietly(f);
    }
}

我会说你的问题在其他地方。

请注意,最佳实践要求 Closeable 对象,例如FileWriter应该在 finally 块中关闭

于 2012-09-12T15:25:42.310 回答
0

假设new RegisterFrame()启动一个 GUI 窗口,问题是你的代码在你有机会输入你的名字之前运行。相反,您需要使用事件侦听器来捕获文本字段的内容,否则获取名称的代码会在窗口打开后立即运行,远在您有机会输入任何内容之前。

时间线是这样的:

  1. RegisterFrame 启动一个新线程来显示 GUI 而不会阻塞您的代码
  2. 您的代码立即从 txtUser 中提取“”,这当然是空的
  3. 现在你输入你的名字
  4. 什么也没有发生,因为您的代码中没有任何内容关注该操作

相反,它应该是:

  1. RegisterFrame 启动一个新线程来显示 GUI 而不会阻塞您的代码
  2. 该方法返回或开始执行不依赖于 GUI 的工作
  3. 现在你输入你的名字
  4. 从新线程触发事件侦听器,并执行获取名称和写入文件的相关操作

您必须确定哪种侦听器对您的用例有意义,例如,您可能希望等到用户单击按钮(例如“提交”或“写入文件”)并在该按钮上注册一个ActionListener 。然后你把你的用户名轮询和文件写入行为放在那个动作中*,你就是金子!

*我应该补充一点,实际上您希望在 ActionListeners 中做的尽可能少,最好检查用户名是否不为空,然后将实际工作传递给另一个线程,例如使用SwingWorker,但是对于你的目的我怀疑不用担心是可以的。

于 2012-09-12T15:34:04.857 回答