2013-10-03 3 views
0

У меня есть JLabel и один JButton в JFrame. Я пишу код для actionPerformed случае JButton, как следующее:Почему я должен определить JLabel перед addActionListener?

btnOK.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      lblA.setText("Hello"); // error here 
     } 
    }); 
final JLabel lblA = new JLabel(""); 

, но я получаю следующее сообщение об ошибке:

lblA cannot be resolved 

однако, если я поставил определить из JLabel до того addActionListener как следующая моя проблема решена:

final JLabel lblA = new JLabel(""); 
btnOK.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      lblA.setText("Hello"); // error here 
     } 
    }); 

Также, если я определяю переменную после нее, я получаю подобную ошибку, и я должен определить переменную перед ней.

Но в C# я могу определить переменную после одного метода и использовать переменную в методе.

ответ

2

Local переменные зависят от положения. Если вы определяете переменную вне конструктора или метода, то позиция не имеет значения. Попробуйте с следующим заявлением:

public class X extends JFrame{ 

    X(){ 
      JButton btnOK=new JButton("OK"); 

     btnOK.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      lblA.setText("Hello"); // error here 
     } 
    }); 
    //  final JLabel lblA = new JLabel(""); 
    } 

    JLabel lblA = new JLabel("");// Try to declare here outside of constructor. 

    public static void main(String[] args){ 
     new X(); 
    } 
} 
+0

Спасибо, очень хорошо! –

+0

Добро пожаловать. – Masudul

1

Если вы не указали переменную lblA, как вы планируете ее использовать (ее неопределенный). Компилятор не будет знать о такой переменной, если она не объявлена.

Вот почему, когда вы поместите этот код выше listener, вы можете использовать, что lblA в нем (так как lblA теперь известно). Таким образом, вы можете использовать переменную только после ее объявления. Если вы попытаетесь использовать его до этого, он будет неопределенным и будет генерировать ошибки компиляции (что переменная не может быть разрешена).

например: -

System.out.println(test); // Print what? I don't know who or what test is. 
String test = "I'm a String"; // Test variable declaration. 

На обратном порядке,

String test = "I'm a String"; // Test variable declaration. 
System.out.println(test); // I know test. I'll print it. 
+0

Вопрос ОП касается положения декларации. Не следует ли объявлять его или нет ... – Thihara

+0

Теперь это имеет смысл ... – Thihara

+0

@Thihara - Получил обновление! :) – SudoRahul

1

variables определяются в порядке, что они были объявлены. Переменная не определена до объявления

+0

мой ответ отредактировал –

+1

@Reimeus Нет всех переменных, но локальные переменные сохраняют порядок. – Masudul

+0

Да, но если вы заметили ответ Масуда, вы увидите, что lblA объявляется после метода. Такие объявления все равно будут работать. – Thihara

0

Просто потому, что вы acessing ссылки, на lblA, до ее объявления. Это похоже на использование чего-то, чего не существует, поэтому второй способ - это правильная форма для этого.

Смежные вопросы