将参数传递给动作侦听器

时间:2019-02-23 10:19:30

标签: java

背景

我正在尝试编写一个程序,用户可以在其中输入格式

A?B:C?(X-1):D?(Y-3):(Z*3)

然后代码将指导用户完成一系列是/否问题,以确定在某些情况下将返回什么。

问题

我写了一个findTrue代码,它将提取这种公式的真实部分。我希望我的yesListener的操作提出另一个问题,如果用户输入的true部分中有更多问号。如果没有,它将返回答案。

        ActionListener yesListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String formula = textArea.getText();
                int i = StringUtils.countMatches(formula, "?");
               if  (i>1) {
                    String newFormula = "";
                    newFormula = findTrue(formula);
                    questionLabel.setText(askQuestion(newFormula));
                }
               else {questionLabel.setText("The formula will return" + findTrue(formula));}
            }};

第一次运行代码可以正常工作,但是第二次从原始输入中再次运行getText()。因此,我认为最好的方法是将字符串传递给actionPerformed而不是在内部求值。但是,我对Java还是很陌生,我正努力查看如何实现这一目标。

2 个答案:

答案 0 :(得分:0)

U无法直接将参数传递给匿名函数。 但是此链接可能会帮助您做到这一点 how-to-pass-parameters-to-anonymous-class

答案 1 :(得分:0)

据我了解,您的ActionListener是在某个类的范围内创建的。很难提出一种最好的方式来重构代码,而又不会看到类的全部代码。

但是要实现您的目标,您可以将getText()的原始值保存在类实例字段中,然后在每次新侦听器调用中对其进行更新:

public class Main {

    private String formula;


    ActionListener yesListener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (formula == null) {
                formula = textArea.getText();
            }
            int i = StringUtils.countMatches(formula, "?");
            if (i > 1) {
                formula = findTrue(formula);
                questionLabel.setText(askQuestion(formula));
            } else {
                questionLabel.setText("The formula will return" + findTrue(formula));
            }
        }

    };