2015-11-27 5 views
0

Итак, я создал JLabel в конструкторе моего основного класса, тогда у меня есть отдельный метод в классе для его обновления (updateLabel()). Но не удается получить доступ к методу из метода обновления. Как я могу получить доступ к нему изнутри метода? БлагодаряПочему я не могу получить доступ к JLabel вне конструктора?

public Difficulty(){ 
    JLabel lblNewLabel = new JLabel((comboBox_9.getSelectedItem().toString())); 
    lblNewLabel.setBounds(300, 70, 46, 23); 
    contentPane.add(lblNewLabel); 
} 

public void updateLabel(Skill skill){ 

} 

В методе обновления этикетки Я хочу сказать lblNewLabel.setText(skill.toString())

Но я не могу получить доступ к этикетке.

+1

Я думаю, из-за рамки переменной JLabel. JLabel, определенный и созданный внутри конструктора, не будет доступен из стороны конструктора. – YoungHobbit

+0

У вас есть что-то вроде 'public class Foo {private JLabel label; public Foo() {label = new JLabel ("Label"); } ...} '? Поэтому: покажите нам свой код. – pzaenger

+1

Оставьте свой код? –

ответ

3

вы должны рассмотреть переменный объем: Java Tutorials - Declaring Member Variables

Если вы объявляете объект в сфере вашего конструктора, то он не будет доступен в другом месте, для экзамена ваш метод updateLabel().

Попробуйте объявить свой JLabel в поле, например:

private JLabel label; 

public JLabelContainer() { 
    label = new JLabel(); 
} 

public void updateLabel(String text){ 
    label.setText(text); 
} 

Здесь метка объявлена ​​на уровне поля, конкретизируется в конструкторе, а затем получить доступ в методе updateLabel(..).

+0

Спасибо за помощь! –

0

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

For example: 
public class Foo{ 

    JLabel label=new JLabel("Global");//this has a global scope 
    public Foo(){ 

     JLabel label_1=new JLabel("local scope");//this can't be accesed outside //the constructor 
    label_1.setText("new text");//but inside the constructor you can do what you want 
    } 
} 
0

Чтобы получить доступ к переменной в любом методе, она должна находиться в объеме этого блока. Если вы хотите получить доступ к переменной в любом месте класса, то переменная должна иметь доступ к public или как минимум быть переменной экземпляра private.

В вашем случае, поскольку JLabel имеет доступ к конструктору в local, область действия этой переменной заканчивается, как только заканчивается конструктор.

В вашем случае, это может быть один из эффективных решений:

private JLabel lblNewLabel; 

public Difficulty(){ 
    lblNewLabel = new JLabel((comboBox_9.getSelectedItem().toString())); 
    lblNewLabel.setBounds(300, 70, 46, 23); 
    contentPane.add(lblNewLabel); 
} 

public void updateLabel(Skill skill){ 
    //access lblNewLabel here. 
}