我看到有一些问题已经被问过这个话题,但我还没有找到答案。我正在编写一个代码,其中用户在JTextField
中键入内容,并且在单击按钮后,他的单词将替换为具有相同字符数的星号数,例如#34; table"将被" ****"取代。我是这样做的:
ask.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String guess = "";
String given = textGive.getText();
for (int i=0; i<given.length(); i++){
String asterisk = "*";
guess += asterisk;
textGive.setText(guess);
}
}
});
我知道我没有这么做,但我不知道怎么做得更好。有什么建议吗?
现在,我想以某种方式保存Strings,原始单词和范围之外的星号,这样我就可以在另一个ActionListener中访问它并进一步修改它。
在写第一个ActionListener
之前,我确实写过String guess = ""
和String given = ""
但似乎没有做任何事情。
所以,在我的第二个ActionListener
中,我想向他发送用户输入单词时收到的字符串given
。
guess.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String attempt = textGuess.getText();
char att = attempt.charAt(0);
for (int i=0; i<5; i++){
if (given.charAt(i)==att){
textGuess.setText("Ok!");
}
}
}
});
Eclipse给我错误说:
&#34;不能引用封闭范围中定义的非最终局部变量&#34;。
我知道我需要将given
设为最终版才能进一步访问它,但如果变量依赖于来自第一个ActionListener
的文本输入,该如何做到这一点?这个问题还有其他解决方案吗?我最近开始使用java,所以我不太熟悉这种语言。
答案 0 :(得分:1)
您希望类可见的任何内容都应放在实例字段中,而不是放在局部变量中。例如,给定变量应该是在类中声明的私有非静态字段,而不是隐藏在侦听器的actionPerformed方法中的变量。
如,
public class Foo extends JPanel {
private JButton ask = new JButton("Ask");
private JTextField textGive = new JTextField(10);
private String given = ""; // visible throughout the class
public Foo() {
add(textGive);
add(ask);
ActionListener listener = e -> {
String guess = "";
// String given = textGive.getText(); //visible only within this method
given = textGive.getText();
guess = given.replaceAll("\\w", "*");
textGive.setText(guess);
};
ask.addActionListener(listener);
textGive.addActionListener(listener); // also give the same listener to the JTextField
}