当前位置: 首页 > 知识库问答 >
问题:

第一次填充哈希集不起作用 - 仅在第二次调用时

伯洋
2023-03-14

我尝试做什么:

我希望HashSet中充满程序不知道的新词。用户按下主机上的“转换”按钮。带有单词的文件的路径在主框架上给出。

如果单词是新单词,则会打开一个J对话框并要求插入新单词(因此您可以更改拼写,例如第一个字母大…)。

如果用户按下JDialog上的“写入”按钮,该单词将添加到HashSet中。

但是如果我在那之后打印我的HashSet,则只显示“旧”值。当我第二次按下主框架上的“转换”按钮时,所有值都将在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

当我按下主机上的“exit”按钮时,编写(在文件中)并显示我的HashSet的代码:

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

共有1个答案

刘昌翰
2023-03-14

您应该考虑将对话框设置为模态。

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

模态和“正常”对话框之间的区别将影响您的代码:

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

模式< code >对话框将阻塞在< code > dialog . set visible(true)行,直到按下< code>write按钮,并且您的< code>ActionListener将处理该事件,设置< code>s = newWord.getText()。trim();并释放< code >对话框。

只有在处理了此事件(< code>write pressed)之后,才会执行< code > dialog . set visible(true)后面的代码行,并且< code>s将包含< code>newWord.getText()的值。trim()。

使用“normal”(非模态)对话框,您不会在对话框中阻塞。setVisible(true)因此

if (!s.contentEquals(""))

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

我建议您调试在< code>if行和< code>write按钮的< code>ActionListener中设置断点的代码。然后你会更好地理解什么时候执行代码,你的字段的值是什么。

 类似资料:
  • 问题内容: 我有一台服务器,可以跟踪一些数据。当我使用管理员应用程序连接到服务器以检出数据的当前状态时。我使用5秒的刷新率。服务器第一次发送数据时,它可以工作。但是第二次,当数据更改时,管理端不会接收到最新数据。我正在通过ObjectOutputStream和ObjectInputStream发送包装在类中的数据: 这是数据的包装器类: public class Leerling implemen

  • 我刚认识科特林·科鲁廷。我刚刚创建了测试livedata的新项目,但我无法观察到数据的变化。我不明白LiveData的概念。什么时候会触发?因为当我观察ROOM数据库时(不是coroutines方式,我使用的是MutableLiveData),它工作得非常好。Observer总是在数据更改时触发。 我的存储库: 我的ViewModel: 我的主要活动:

  • 问题内容: 我对文件进行迭代有问题。这是我在解释器上键入的内容和结果: 当我尝试再次遍历同一个打开的文件时,我什么也没得到! 根本没有输出。为了解决这个问题,我必须对文件进行编辑,然后再次将其打开以进行读取!那是正常行为吗? 问题答案: 是的,这是正常行为。基本上,你是第一次读取文件的末尾(可以像读取磁带一样对它进行图片处理),因此除非你使用重定位到文件开头的位置进行重置,否则你将无法从文件中读取

  • 我试图使用MathJax将HTML文本框(Tex)中键入的方程视为数学方程。如果没有正确地查看方程,我需要编辑方程,并在数学方程中查看它。 第一次,它工作正常。但是在执行编辑后,Mathjax排版命令显示错误。请您检查一下,并建议可能的错误。 我使用的HTML是: 我使用的脚本是: 当我第二次单击按钮时,它会显示以下错误: 未捕获的TypeError:无法在l.append(tex mml cht

  • 问题内容: 我有一些这样定义的路线: 在这些路线中,我有一个禁区和一个授予访问权页面以授予对该禁区的访问权限。当解析提供者被拒绝时,我将重定向到该路由。 这是执行此操作的代码: 这是我的提供者的代码: (只返回一个布尔值) 我第一次与提供者一起去路线被执行。该路由被拒绝,因为未授予访问权限,我们被重定向到该路由。 在此页面中,用户可以登录并有权访问限制区域。一旦用户登录,我们会将其重定向到该路由,

  • 我正在使用React-useState钩子更新状态。单击表单提交按钮时,状态直到第二次单击才更新。我相信我需要使用useffect,但不确定如何使用onClick实现。