2013-10-07 65 views
1

這似乎是一個非常簡單的問題,但我在處理它時遇到了很多麻煩。JButton中的訪問變量ActionListener

示例方案:

final int number = 0; 

    JFrame frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setSize(400, 400); 

    final JTextArea text = new JTextArea(); 
    frame.add(text, BorderLayout.NORTH); 

    JButton button = new JButton(number + ""); 
    button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
     number++; // Error is on this line 
     text.setText(number + ""); 
    }}); 
    frame.add(button, BorderLayout.SOUTH); 

我真的不知道哪裏去了。

+0

請說明你需要做什麼以及不能做什麼。 –

回答

5

如果您將number聲明爲final,則無法修改其值。您必須刪除final修飾符。

然後,您可以通過訪問該變量:

public class Scenario { 
    private int number; 

    public Scenario() { 
     JButton button = new JButton(number + ""); 
     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       Scenario.this.number++; 
       text.setText(Scenario.this.number + ""); 
      } 
     }); 
    } 
} 

符號「ClassName.this」允許您訪問到你在一個類的對象

保持atention英寸當您第一次使用「號碼」時, - new JButton(number) - ,您可以直接訪問號碼,因爲您處於場景範圍內。但是,當您在ActionListener中使用它時,您處於ActionListener作用域而不是Scenario作用域。這就是爲什麼你不能直接在動作偵聽器內部看到變量「number」,你必須訪問你所在的場景的實例。這可以通過場景來完成。這可以通過以下方式完成:

+0

'ClassName.this'?那究竟做了什麼? – Cruncher

+0

我會編輯我的答案,以便更清楚;-) –

+0

我懷疑數字可以是私人的還是必須保護/公開 –

2

最快的解決方案是將number聲明爲static,並使用您的班級名稱進行引用。

或者,您可以創建一個類implements ActionListener,並將numbertext傳遞給它的構造函數。