第一次填充 HashSet 不起作用——仅在第二次调用时起作用

Filling a HashSet doesn't work the first time -- only on second call

我尝试做的事情:

我想要一个 HashSet 来填充程序不知道的新单词。 用户按下主框架上的 "convert" 按钮。 mainFrame上给出了word文件的路径

如果单词是新单词,则会打开 JDialog 并要求插入新单词(这样您就可以更改拼写,例如第一个字母 big...)。

如果用户按下 JDialog 上的按钮 "write",该词将添加到 HashSet。

但是如果我在那之后打印我的 HashSet,则只显示 "old" 值。 当我第二次按下 mainFrame 上的 "convert" 按钮时,所有值都将在 HashSet 中正确显示。

如果有人能帮助我,我将不胜感激。 如果需要更多信息,请告诉我。 这是按下按钮 "convert" 时来自 ActionListener 的代码:

        if (e.getActionCommand().equals(convert.getActionCommand())) {
        try {
            //a file with words is given
            fileHandler = new FileIO(path.getText().trim());

            //lines is a ArrayList<String> and returns all the lines
            lines = fileHandler.readFile();

            for (int i = 0; i < lines.size(); i++) {
                //words is a String[]
                words = lines.get(i).split(" ");
                for (int j = 0; j < words.length; j++) {

                    //hs is a HashSet<String>
                    if (hs.contains(words[j])) {
                        System.out.println("hit: " + words[j]);
                    }else if (!hs.contains(words[j])) {
                        dialog = new JDialog(mainFrame);
                        dialog.setTitle("new Word");
                        dialog.setLayout(new BorderLayout());

                        newWord = new JTextField(words[j].toLowerCase());
                        newWord.selectAll();

                        write = new JButton("write");

                        write.addActionListener(new ActionListener() {

                            public void actionPerformed(ActionEvent e) {
                                //can not use the counters "i" or "j" here otherwise it would be so easy...
                                s = newWord.getText().trim();
                                dialog.setVisible(false);
                                if(dialog != null)
                                    dialog.dispose();
                                if (dialog.isActive()) {
                                    System.out.println("active");
                                }else {
                                    //dead code ??? -- never executed so far
                                    System.out.println("finally....done");
                                }
                            }
                        });

                        dialog.add(newWord, BorderLayout.NORTH);
                        dialog.add(write, BorderLayout.SOUTH);
                        dialog.pack();
                        dialog.setVisible(true);

                        //todo is filled correctly IF pressed "convert Button" the second time
                        if (!s.contentEquals("")) {
                            words[j] = s;
                            hs.add(s);
                            s = "";
                        }

                    }
                } // words


                //Displays the input line but why not the manipulated from the JDialog input?
                StringBuffer sb = new StringBuffer();
                for (String string : words) {
                    sb.append(string);
                    sb.append(" ");
                }
                System.out.println(sb.toString());
                lines.set(i, sb.toString());
                sb.delete(0, sb.length());

            } // lines

当我按下主框架上的 "exit" 按钮时写入(在文件中)并显示我的 HashSet 的代码:

    hashSetHandler = new HashSetIO(WORDS_FILE);
    hashSetHandler.write(hs);
    for (String string : hs) {
        System.out.println(string);

你应该考虑让你的 dialog 模态。

目前,当您按下 convert 时,您会看到很多弹出窗口(每个新单词对应一个从文件中读取的单词),不是吗?

模态和"normal"dialog之间的区别会影响你这里的代码:

dialog.setVisible(true);
//todo is filled correctly IF pressed "convert Button" the second time
if (!s.contentEquals("")) {
  words[j] = s;
  hs.add(s);
  s = "";
}

模态 dialog 将阻塞在 dialog.setVisible(true) 行,直到按下 write 按钮,您的 ActionListener 将处理事件,设置 s = newWord.getText().trim(); 并处理 dialog.

只有在处理完此事件(write 按下)后,才会执行 dialog.setVisible(true) 之后的代码行,而 s 将包含 [=24] 的值=].

使用 "normal"(非模态)dialog 你不会阻塞在 dialog.setVisible(true) 因此

if (!s.contentEquals(""))

行将检查 s 的一些尚未设置的值(您尚未按下 write 按钮),测试将失败,并且 if 中的代码块不会被执行。

我建议您调试代码 在 if 行和 write 按钮的 ActionListener 处设置断点。然后你会更好地理解代码何时执行以及你的字段的值是什么。