我尝试做什么:
我希望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);
您应该考虑将对话框
设置为模态。
目前,当您按下转换
时,您会看到许多弹出窗口(从文件中读取的每个新词一个),不是吗?
模态和“正常”对话框
之间的区别将影响您的代码:
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实现。