Java 无法传递在“public void actionPerformed(ActionEvent事件)”中声明的变量

Java 无法传递在“public void actionPerformed(ActionEvent事件)”中声明的变量,java,swing,events,event-handling,Java,Swing,Events,Event Handling,我正在创建WindowBuilder GUI,需要将使用单选按钮创建的变量传递给EventHandler类,以便在进一步处理中使用。单选按钮事件的输出成功;但是,在中的actionPerformed方法中声明的变量df在EventHanler类中没有解析。任何帮助都将不胜感激 public TestClass() { /* INSERT RADIOBUTTON INTO FRAME. */ JRadioButton rdbtnNo = new JRadioButton("No"

我正在创建WindowBuilder GUI,需要将使用单选按钮创建的变量传递给EventHandler类,以便在进一步处理中使用。单选按钮事件的输出成功;但是,在中的actionPerformed方法中声明的变量df在EventHanler类中没有解析。任何帮助都将不胜感激

public TestClass() {

    /* INSERT RADIOBUTTON INTO FRAME. */
    JRadioButton rdbtnNo = new JRadioButton("No");
    rdbtnNo.setFont(new Font("Tahoma", Font.BOLD, 12));
    rdbtnNo.setBounds(332, 509, 63, 23);
    frame.getContentPane().add(rdbtnNo);

    /* LISTEN FOR RADIOBUTTON BUTTON. */
    rdbtnNo.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            String command = event.getActionCommand();
            System.out.println(command);
            int df = 20;                    
        }           
    });

    rdbtn.setActionCommand("event");
    rdbtn.addActionListener(new EventHandler());

}

public class EventHandler implements ActionListener {
    public void actionPerformed(ActionEvent event) {

        System.out.println(df);
    }
}                               

第一件事是去掉匿名内部类,改用lambdas。它使您的代码更易于理解

public TestClass() {

    /* INSERT RADIOBUTTON INTO FRAME. */
    JRadioButton rdbtnNo = new JRadioButton("No");
    rdbtnNo.setFont(new Font("Tahoma", Font.BOLD, 12));
    rdbtnNo.setBounds(332, 509, 63, 23);
    frame.getContentPane().add(rdbtnNo);

    /* LISTEN FOR RADIOBUTTON BUTTON. */
    rdbtnNo.addActionListener(event -> pressedTheButton(event));

    rdbtn.setActionCommand("event");
    rdbtn.addActionListener(new EventHandler());

}

public void pressedTheButton(ActionEvent event) {
    String command = event.getActionCommand();
    System.out.println(command);
    int df = 20;
    printStuff(df);
}

public void printStuff(int input) {
    System.out.println(input);
}



           ///DELETE THIS.  This is unneeded, use Java 8 stuff, it's awesome////
public class EventHandler implements ActionListener {
    public void actionPerformed(ActionEvent event) {

        System.out.println(df);
    }
}       
在你的代码中。
您也有其他错误,但当您在下面声明了该内部类时,必须在addActionListener方法中实例化它以利用它。

无法在其他类中解析它,因为该变量的范围仅在该方法中:

public void actionPerformed(ActionEvent event) {
                String command = event.getActionCommand();
                System.out.println(command);
                int df = 20;                    
            } 
在中的actionPerformed方法中声明的变量df未在EventHanler类中解析

这是因为。在您的示例中,您将df声明为传递给AddActionListener的匿名内部类的actionPerformedActionEvent方法中的局部变量。局部变量只能在创建它们的代码块内访问。这意味着除了actionPerformedActionEvent方法之外,您的df变量不能在任何其他地方访问

解决这一问题的第一步是将df作为测试类中的实例变量,以便可以在actionPerformedActionEvent方法内外访问它

这里有两种可能的方法:

对两个按钮使用第二个匿名内部类

public class Test {

    private int df;

    public Test() {
        // ...
        final JButton button = new JButton("Click Me");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                df = 20;
            }

        });
        final JButton button2 = new JButton("Click Me Again");
        button2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(df == 20) { // got instance
                    // TODO do a thing
                }
            }

        });
        // ...
    }

}
将df传递给EventHandler的构造函数


旁注:不要使用空布局!请参见

TestClass方法是否返回任何内容?了解变量作用域:是否尝试添加2个EventListener?
public class Test {

    private int df;

    public Test() {
        // ...
        final JButton button = new JButton("Click Me");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                df = 20;
            }

        });
        final JButton button2 = new JButton("Click Me Again");
        button2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(df == 20) { // got instance
                    // TODO do a thing
                }
            }

        });
        // ...
    }

}
public class Test {

    private int df;

    public Test() {
        // ... button1 ...
        final JButton button2 = new JButton("Click Me Again");
        button2.addActionListener(new EventHandler());
        // ...
    }

}

// different file
public class EventHandler implements ActionListener {

    private int df;

    public EventHandler(int df) {
        this.df = df; // got instance
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(df == 20) {
            // TODO do a thing
        }
    }
}