2013-04-05 3 views
2

Как получить доступ к instance variables из метода анонимного класса?Как я могу получить доступ к переменным экземпляра класса изнутри анонимного класса?

class Tester extends JFrame { 

    private JButton button; 
    private JLabel label; 
    //..some more 

    public Tester() { 
     function(); // CALL FUNCTION 
    } 

    public void function() { 
     Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      // How do I access button and label from here ? 
     } 
     }; 
     new Thread(r).start(); 
    } 
} 
+3

Вы просто получить доступ к ним, а на самом деле не должно быть никаких проблем с выполнением этого. Что именно не работает? –

+0

Возможный дубликат [Как получить доступ к частным членам класса класса контейнера внутри внутреннего класса anonymouse?] (Http://stackoverflow.com/questions/7574865/how-can-i-access-private-class-members-of -container-class-in-anonymouse) –

+0

@HovercraftFullOfEels Как вы думаете, он будет работать? 'this.Foo' ищет объект« суперкласс », который не является« тестером », а неназванным классом, который мы называем анонимным внутренним классом. – saplingPro

ответ

2

Как получить доступ к instance variables из метода анонимного класса?

Вы просто получить доступ к ним в случае необходимости:

class Tester extends JFrame { 

    private JButton button; 
    private JLabel label; 
    //..some more 

    public Tester() { 
     function(); // CALL FUNCTION 
    } 

    public void function() { 
     Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Button's text is: " + button.getText()); 
     } 
     }; 
     new Thread(r).start(); 
    } 
} 

Еще важнее: Почему это не работает для вас?

+1

Я делал 'this.label'. Причина! – saplingPro

+1

@saplingPro: нет необходимости квалифицировать вашу переменную с помощью 'this' в этой ситуации, если нет столкновений имен - две переменные с тем же именем, одна во внутренней и одна во внешнем классе. В этом случае ответ Джаррода будет правильным. Но ваш вопрос никогда не говорил нам, что вы использовали «это», чтобы начать с очень запутанного и неполного вопроса. –

9

Что вы ищете является полным адресом, так как они не маркированы final

final Runnable r = new Runnable() { 
public void run() { 
    Tester.this.button // access what you need 
    Tester.this.label // access what you need 
}}; 

Вы используете один и тот же шаблон доступа для Anonymous Inner Classes при строительстве ActionListeners и других вещей.

Это объясняется в технических характеристиках как 15.8.4 Qualified this, что-то, кто, по-видимому, не читал ни одного избирателя. И не прочитал код для понимания.

2

следующий код может объяснить вам формат является IncloseingClassName.this.VariableName;

class Tester extends JFrame { 
int abc=44;//class variable with collision in name 
int xyz=4 ;//class variable without collision in name 
public Tester() { 
function(); // CALL FUNCTION 
} 
public void function() { 
Runnable r = new Runnable() { 
int abc=55;//anonymous class variable 
    @Override 
    public void run() { 
     System.out.println(this.abc); //output is 55   
     System.out.println(abc);//output is 55 
     System.out.println(Tester.this.abc);//output is 44 
     //System.out.println(this.xyz);//this will give error 
     System.out.println(Tester.this.xyz);//output is 4 
     System.out.println(xyz);//output is 4 
      //output is 4 if variable is declared in only enclosing method 
      //then there is no need of Tester.this.abcd ie you can directly 
      //use the variable name if there is no duplication 
      //ie two variables with same name hope you understood :) 

    } 
    }; 
    new Thread(r).start(); 
    } } 
Смежные вопросы