Java 填充哈希集不需要';I don’我第一次不工作,只能打第二次电话

Java 填充哈希集不需要';I don’我第一次不工作,只能打第二次电话,java,dispose,hashset,jdialog,Java,Dispose,Hashset,Jdialog,我想做的是: 我想用程序不知道的新词填充哈希集。 用户按下主机上的“转换”按钮。 大型机上给出了包含单词的文件的路径 如果单词是新的,则会打开一个JDialog并要求插入新单词(以便您可以更改拼写,例如第一个字母大…) 如果用户按下JDialog上的“write”按钮,则该单词将添加到哈希集中 但是如果我在那之后打印HashSet,则只显示“旧”值。 当我第二次按下大型机上的“convert”按钮时,所有值都将正确显示在HashSet中 如果有人能帮助我,我将非常感激。 如果需要更多信息,请告诉

我想做的是:

我想用程序不知道的新词填充哈希集。 用户按下主机上的“转换”按钮。 大型机上给出了包含单词的文件的路径

如果单词是新的,则会打开一个JDialog并要求插入新单词(以便您可以更改拼写,例如第一个字母大…)

如果用户按下JDialog上的“write”按钮,则该单词将添加到哈希集中

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

如果有人能帮助我,我将非常感激。 如果需要更多信息,请告诉我。 以下是按下按钮“转换”时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

你应该考虑制作你的<代码>对话框<代码> MOD.< /P> 当前,当您按“转换”按钮时,会看到许多弹出窗口(从文件中读取的每个新词对应一个),不是吗

模态对话框和“正常”对话框之间的差异将影响此处的代码:

dialog.setVisible(true);
//todo is filled correctly IF pressed "convert Button" the second time
if (!s.contentEquals("")) {
  words[j] = s;
  hs.add(s);
  s = "";
}
模式
对话框
将在
对话框.setVisible(true)
行阻塞,直到按下
写入
按钮,并且
操作侦听器
将处理事件,设置
s=newWord.getText().trim()并处理
对话框

仅在处理此事件(
write
按下)后,才会执行
对话框后面的代码行。setVisible(true)
将被执行,并且
s
将包含
newWord.getText().trim()的值

使用“正常”(非模态)
对话框
时,您不会在
对话框中阻塞。设置可见(true)
因此

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


我建议您调试
if
行和
write
按钮的
ActionListener
中设置断点的代码。这样,您就可以更好地理解何时执行代码以及字段的值是什么。

如何声明
s
?它是封闭类的成员变量?它是在同一类中声明的变量,如:public class MainFrame{HashSet hs;该类有一个名为“MainFrame”的Jframe,并在该Jframe的Actionlistener中声明(也在同一类中声明)这是我显示的代码。您说单词没有添加到
哈希集
,但您的代码打印的是
中的内容,而不是
hs
中的内容。它是什么?当您按“转换”时第二次按下按钮时,它是否会提示您添加相同的单词,还是会在不弹出任何对话框的情况下执行?我的代码只打印“行”中的内容,但只打印输入文件中的值,而不打印必须手动输入的JDialog中的操纵单词。第一次按下“转换”时,哈希集显示错误按钮,但如果我在第二次按下它,则完全可以。对于哈希集中没有的每个单词,都会弹出一个新对话框,您可以修改该单词,然后将其写回(理论上),但只有当我按下“转换”按钮时,它才起作用t您的代码没有显示
哈希集
。您在说什么?嘿,非常感谢您解决了整个问题:)现在,我第一次按“转换”时哈希集已正确填充然后插入单词。是的,它确实为每个不带模态标志的未知单词打开了一个对话框。我不明白确切原因,但我会找到答案。
dialog=new JDialog(mainFrame,JDialog.ModalityType.DOCUMENT_modal);
if (!s.contentEquals(""))