7

以下のコードのようなものがあります。

    for(int i=0;i<10;i++){
        button=new JButton(buttons[i]);
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                setPage(i);
            }
        });
        menu.add(button);
    }

ただし、変数iは ActionListener クラスのスコープで定義されていません。どうすれば変数を渡すことができますか?

4

3 に答える 3

22

まったく異なるアプローチは、ボタンにプロパティを追加し、アクション リスナーでそのプロパティを取得することです。例えば

button=new JButton(buttons[i]);
button.putClientProperty( "page", i );
button.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
      setPage((Integer)((JButton)e.getSource()).getClientProperty( "page" ));
   }
});
于 2012-06-14T18:37:26.470 に答える
20

Hovercraft の回答に加えて、リスナーに匿名クラスを使用することを強制されていないことに注意してください。Hovercraft の回答のコードは、次のようなものです。

private class PageActionListener implements ActionListener {
    private int page;

    public PageActionListener(int page) {
        this.page = page;
    }

    public void actionPerformed(ActionEvent e) {
        setPage(page);
    }
}

...

for(int i = 0; i < 10; i++){
    button = new JButton(buttons[i]);
    button.addActionListener(new PageActionListener(i));
    menu.add(button);
}
于 2012-06-14T16:50:18.630 に答える
13

変数i 実際には ActionListener のスコープ内にありますが、内部クラスでローカル変数を使用しようとしているため、変数は final でなければなりません。したがって、これには final 変数を使用できます。

for(int i=0;i<10;i++){
    final int index = i;
    button=new JButton(buttons[i]);
    button.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            setPage(index);
        }
    });
    menu.add(button);
}
于 2012-06-14T16:43:56.623 に答える