[英]Can't access these variables outside the ActionListener
我整个周末都被困住了,我到处都是,没有一个单一的解决方案。 感谢所有帮助。
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 = 0;
Calendar caBirthDate = new GregorianCalendar(iYearBirth, iMonthBirth - 1, iDayBirth);
Calendar caCurrentDate = new GregorianCalendar(iYearCurrent, iMonthCurrent - 1, iDayCurrent);
JButton btnCalculate = new JButton("Calculate");
btnCalculate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
iDaysAlive = (caCurrentDate.getTimeInMillis() - caBirthDate.getTimeInMillis());
iDaysAlive = (iDaysAlive / (24 * 60 * 60 * 1000) + 1);
// GET THE ERROR HERE: "Cannot refer to a non-final variable caBirthDate inside an inner class defined in a different method
//get the same error for, caBirthDate and iDaysAlive
}
});
btnCalculate.setFont(new Font("Calibri", Font.BOLD, 12));
btnCalculate.setBounds(188, 187, 89, 23);
frame.getContentPane().add(btnCalculate);
jTextField_Result = new JTextField("Total Days Alive: " + iDaysAlive);
jTextField_Result.setBounds(150, 233, 170, 20);
frame.getContentPane().add(jTextField_Result);
jTextField_Result.setColumns(10);
如果将calender和integer变量移至ActionListener内,则无法在最终文本字段中访问iDaysAlive变量。
如错误所示:
Cannot refer to a non-final variable caBirthDate inside an inner class defined in a different method
您需要声明变量final
以便在ActionListener
访问它们:
final int CURR_X = redSquare.getX();
不过要小心:
将变量定为final意味着程序可以/不会对其进行修改。 它允许编译器优化某些代码。 它也告诉任何阅读程序的变量都是常量。 例如,在程序中,您将PI的值定义为常量,并在程序中使用该变量,而不是在需要该值的任何地方键入3.14...。
因此,一个好的解决方案是:
要创建一个类,需要实现 ActionListener
类。 然后,您可以对所需的变量进行任何类访问。
另一个可能的解决方案:
例如:
class Wrapper {
public int iDaysAlive;
public Wrapper (int iDaysAlive){
this.iDaysAlive = iDaysAlive;
}
}
然后:
int iDaysAlive = 0;
final Wrapper w = new Wrapper(iDaysAlive);
然后在ActionListener中:
w.iDaysAlive = (caCurrentDate.getTimeInMillis() - caBirthDate.getTimeInMillis());
一种解决方案是创建实现Action侦听器的类。 然后,您可以授予tha类访问所需变量的权限:
class ActionHandler implements ActionListener {
public ActionHandler (MainClass mainClass) {
//now getters of the main class can be called
}
public void actionPerformed(ActionEvent e) { }
}
您声明了ActionListener的匿名类。 请参阅https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html#accessing了解oracle的文档:
匿名类无法在其封闭范围内访问未声明为final或实际上不是final的局部变量。
请参阅为什么不能在内部类内部使用非最终的“局部”变量,而可以在封闭类中使用非最终的字段? 为什么
针对您的情况的变通方法:1.声明需要在类范围内的匿名类内部访问的iDaysAlive,caBirthDate,caCurrentDate和其他变量2.重构actionPerformed(ActionEvent e)以调用处理程序方法
actionPerformed(ActionEvent e) {
handleEvent(e);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.