2015-04-25 55 views
0

希望這不是一個混亂,我是新來的Java。我不知道如何訪問ActionListener之外的「iDaysAlive」變量。如何訪問JButton ActionListener中的變量?

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); 

回答

1

您不能,變量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的

+0

MyCoolActionLIstener在這裏代表什麼? – theSwein

1

外的變量你必須在函數外部聲明該變量。只要寫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); 
+0

我試過這個,但是一旦我將它移到外面,我在這裏得到一個錯誤: iDaysAlive = caCurrentDate.getTimeInMillis() - caBirthDate.getTimeInMillis(); \t \t \t iDaysAlive = iDaysAlive /(24 * 60 * 60 * 1000)+ 1; //不能引用非最終變量iDaysAlive在用不同方法定義的內部類中 你知道這是爲什麼嗎? – theSwein

+0

我編輯了我的文章 – tobiinformatik

+0

現在它說「非法修改參數iDaysAlive;只有最後被允許」 – theSwein

1

要訪問它必須被外部聲明匿名類之外的變量之前,它必須是final

在你的情況下,這將無法正常工作,因爲如果你做了雙重決定,你不能改變它。因此,您可以使用具體類而不是匿名類將結果存儲在屬性中以便稍後訪問。或者,您可以使用助手類來獲取可以聲明爲final的結果,並擁有要從匿名操作偵聽器更改的屬性。或者你可以簡單地把它作爲封閉類的一個屬性。

+0

是真的。或者你可以聲明它爲類的字段,那麼你可以修改它 –

+0

謝謝,我也加了這個 – tomse

1
double iDaysAlive; 

這應該在函數之外聲明,更好的是在類的頂部聲明。事實上,你應該閱讀關於全局變量和局部變量的內容,因爲這會對你有很大的幫助。與此同時,地方

double iDaysAlive = 0.0; 

在類的開始,它應該沒問題。