从ActionListener发送变量,以便另一个ActionListener可以使用它

时间:2016-11-24 21:55:38

标签: java variables scope actionlistener

我看到有一些问题已经被问过这个话题,但我还没有找到答案。我正在编写一个代码,其中用户在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,所以我不太熟悉这种语言。

1 个答案:

答案 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
    }
相关问题