2013-09-10 4 views
1

Ниже моя коды:Как написать ActionListener в Java

JLabel label1 = new JLabel("testcontent"); 
label1.setBounds(131, 57, 205, 74); 

frame.getContentPane().add(label1); 

JButton btn1 = new JButton("run"); 
btn1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 

    } 
}); 

btn1.setBounds(169, 206, 117, 25); 
frame.getContentPane().add(btn1); 

Когда я пытаюсь передать Label1 в actionPerformed, затмение не может найти Label1. Кто-нибудь мог сказать мне, что случилось?

ответ

6

label1 не доступен в объеме ActionListener. Либо объявить его как final или сделать это экземпляр класса переменной

final JLabel label1 = new JLabel("testcontent"); 
+0

Но ... но тогда у вас есть этикетка 'final' .... – MirroredFate

+0

Какой у вас вопрос? – Reimeus

+0

Вы не используете 'final' в качестве дизайнерского решения, которое вы используете как обходное решение - совершенно ненужное обходное решение. Это плохое программирование. – MirroredFate

1

Вы можете получить вокруг использования final делая то, что описано в this ответ.

В принципе, вы передаете этикетку с помощью метода init, который вы вызываете сразу же после создания анонимного объекта. В вашем случае, это будет выглядеть примерно так:

btn1.addActionListener(new ActionListener() { 
    private JLabel myLabel; 
    private ActionListener init(JLabel var){ 
     myLabel = var; 
     return this; 
    } 
    public void actionPerformed(ActionEvent e) { 

    } 
}.init(myVariable)); 

Ссылка myLabel затем доступен в actionPerformed метода btn1 «s.