繁体   English   中英

如何在JButton ActionListener中访问变量?

[英]How can I access a variable in an JButton ActionListener?

希望这不是一团糟,我是Java的新手。 而且我不知道如何在ActionListener之外访问“ iDaysAlive”变量。

    JButton jButton_Calculate = new JButton("Calculate");
    jButton_Calculate.addActionListener(new ActionListener() {
        public void actionPerformed (ActionEvent arg0) {

            int iDayBirth = Integer.parseInt(jTextField_DoBDay.getText());
            int iMonthBirth = Integer.parseInt(jTextField_DoBMonth.getText());
            int iYearBirth = Integer.parseInt(jTextField_DoBYear.getText());

            int iDayCurrent = Integer.parseInt(jTextField_CdDay.getText());
            int iMonthCurrent = Integer.parseInt(jTextField_CdMonth.getText());
            int iYearCurrent = Integer.parseInt(jTextField_CdYear.getText());

            double iDaysAlive;

            Calendar caBirthDate = new GregorianCalendar(iYearBirth, iMonthBirth - 1, iDayBirth);
            Calendar caCurrentDate = new GregorianCalendar(iYearCurrent, iMonthCurrent - 1, iDayCurrent);

            iDaysAlive = caCurrentDate.getTimeInMillis() - caBirthDate.getTimeInMillis();
            iDaysAlive = iDaysAlive / (24 * 60 * 60 * 1000) + 1; //this variable
        }
    });

    jButton_Calculate.setFont(new Font("Calibri", Font.BOLD, 15));
    jButton_Calculate.setBounds(180, 205, 103, 23);
    frame.getContentPane().add(jButton_Calculate);

    JLabel lblDaysAlive = new JLabel("Days Alive: " + iDaysAlive);

    //iDaysAlive cannot be resolved to a variable

    lblDaysAlive.setFont(new Font("Calibri", Font.BOLD, 18));
    lblDaysAlive.setBounds(135, 257, 147, 21);
    frame.getContentPane().add(lblDaysAlive);

您不能,变量iDaysAlive仅在actionPerformed方法的范围内可见。

即使您将其添加为类的字段,由于ActionListener的构造异样,您也无法访问它。

实现一个实现ActionListener的类,例如

class MyCoolActionListener implements ActionListener
{
double iDaysAlive;
@Override
public void actionPerformed (ActionEvent arg0) {

        int iDayBirth = Integer.parseInt(jTextField_DoBDay.getText());
        int iMonthBirth = Integer.parseInt(jTextField_DoBMonth.getText());
        int iYearBirth = Integer.parseInt(jTextField_DoBYear.getText());

        int iDayCurrent = Integer.parseInt(jTextField_CdDay.getText());
        int iMonthCurrent = Integer.parseInt(jTextField_CdMonth.getText());
        int iYearCurrent = Integer.parseInt(jTextField_CdYear.getText());

        double iDaysAlive;

        Calendar caBirthDate = new GregorianCalendar(iYearBirth, iMonthBirth - 1, iDayBirth);
        Calendar caCurrentDate = new GregorianCalendar(iYearCurrent, iMonthCurrent - 1, iDayCurrent);

        iDaysAlive = caCurrentDate.getTimeInMillis() - caBirthDate.getTimeInMillis();
        iDaysAlive = iDaysAlive / (24 * 60 * 60 * 1000) + 1; //this variable
    }
public double getIDaysAlive()
{
return iDaysAlive;
}
}

并将iDaysAlive添加为字段。 编写getter和setter方法并像使用它

MyCoolActionListener al = new MyCoolActionListener()
jButton_Calculate.addActionListener(al);
al.getIDaysAlive();

编辑:或者,更容易:在actionListener之外定义需要访问的变量

如果要在函数外部访问变量,则必须在函数外部声明变量。 只需编写double iDaysAlive; 在您工作之前

double iDaysAlive; // Declare outside
JButton jButton_Calculate = new JButton("Calculate");
jButton_Calculate.addActionListener(new ActionListener() {
    public void actionPerformed (ActionEvent arg0) {

        int iDayBirth = Integer.parseInt(jTextField_DoBDay.getText());
        int iMonthBirth = Integer.parseInt(jTextField_DoBMonth.getText());
        int iYearBirth = Integer.parseInt(jTextField_DoBYear.getText());

        int iDayCurrent = Integer.parseInt(jTextField_CdDay.getText());
        int iMonthCurrent = Integer.parseInt(jTextField_CdMonth.getText());
        int iYearCurrent = Integer.parseInt(jTextField_CdYear.getText());


        Calendar caBirthDate = new GregorianCalendar(iYearBirth, iMonthBirth - 1, iDayBirth);
        Calendar caCurrentDate = new GregorianCalendar(iYearCurrent, iMonthCurrent - 1, iDayCurrent);

        iDaysAlive = caCurrentDate.getTimeInMillis() - caBirthDate.getTimeInMillis();
        iDaysAlive = iDaysAlive / (24 * 60 * 60 * 1000) + 1; //this variable
    }
});

jButton_Calculate.setFont(new Font("Calibri", Font.BOLD, 15));
jButton_Calculate.setBounds(180, 205, 103, 23);
frame.getContentPane().add(jButton_Calculate);

JLabel lblDaysAlive = new JLabel("Days Alive: " + iDaysAlive);

//you have now acces to the variable iDaysAlive

lblDaysAlive.setFont(new Font("Calibri", Font.BOLD, 18));
lblDaysAlive.setBounds(135, 257, 147, 21);
frame.getContentPane().add(lblDaysAlive);

要访问匿名类之外的变量,必须在外部声明它,并且它必须是final

在您的情况下,这将不起作用,因为如果您进入双决赛,则无法更改。 因此,您可以使用一个具体的类而不是匿名的类来将结果存储在一个属性中以供以后访问。 或者,您可以使用帮助程序类作为结果,可以将其声明为final,并保留要从匿名操作侦听器更改的属性。 或者,您可以使其简单地成为封闭类的一个属性。

double iDaysAlive;

这应该在函数外部声明,最好在类的顶部声明。 实际上,您应该阅读全局变量与局部变量,因为这将对您有很大帮助。 同时,放置

double iDaysAlive = 0.0;

在课程开始时,应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM