我尝试做什么:
我希望HashSet充满程序不知道的新单词。 用户按下mainFrame上的“转换”按钮。 带有单词的文件的路径在mainFrame上给出。
如果单词是新的,则打开JDialog并要求插入新单词(这样您就可以更改拼写,例如首字母大...)。
如果用户按下JDialog上的“写入”按钮,该单词将被添加到HashSet中。
但是如果我之后打印我的HashSet,则只显示“旧”值。 当我第二次按下mainFrame上的“转换”按钮时,所有值都将在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
当我按下mainFrame上的“exit”按钮时,写入(在文件中)并显示我的HashSet的代码:
hashSetHandler = new HashSetIO(WORDS_FILE);
hashSetHandler.write(hs);
for (String string : hs) {
System.out.println(string);
答案 0 :(得分:0)
您应该考虑制作dialog
模式。
目前,当您按convert
时,您会看到许多弹出式窗口(每个新文字从文件中读取一个),不是吗?
模态和“普通”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
将包含newWord.getText().trim()
的值
使用“普通”(非模态)dialog
,您不会在dialog.setVisible(true)
阻止
if (!s.contentEquals(""))
行将检查尚未设置的s
的某些值(您还没有按下write
按钮),测试将失败,if
块中的代码将是没有执行。
我建议您调试代码在if
行和ActionListener
按钮的write
上设置断点。然后,您将更好地理解代码的执行以及字段的值。