Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не видна переменная из слушателя для кнопки. 
:(
    Опции темы
freshAngel
  Дата 26.7.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Есть код: 
Код

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(200,300);

JPanel panel = new JPanel();
JButton button = new JButton("Cool");

button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.setVisible(false);
}
});
   
panel.add(button);
frame.add(panel);
frame.setVisible(true);
}



При нажатии на кнопку "Cool" фрейм должен скрываться.
Но проблема в том, что в слушателе не видна переменная frame.
А если сделать так как подсказывает NetBeans 

Код

final JFrame frame = new JFrame();


То все работает.
Зачем здесь нужен спецификатор final.
Насколько я знаю с помощью этого спецификатора можно создавать константы и отменять наследование. А здесь зачем!?
Кстати если передать например аргумент функции которая описана в другом *.java файле, то этот аргумент у функции так-же должен иметь этот спецификатор.

Знаю, что в JAVA для того, чтоб переменные были видны в анонимном классе, они должны быть объявлены как final.
Но почему тогда - так:

Код

class Test {
public int a = 0;

public Test() {
JButton button = new JButton();

button.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        a = 5;
      }
    });
}

}



Переменная "a" не имеет спецификатора final и вызывается из анонимного класса слушателя. Все работает в данном случае.

PM MAIL   Вверх
Evgeni68
Дата 26.7.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 9.7.2007

Репутация: нет
Всего: 3



Цитата(freshAngel @  26.7.2009,  11:55 Найти цитируемый пост)
Переменная "a" не имеет спецификатора final и вызывается из анонимного класса слушателя. Все работает в данном случае.

Переменная "a" является полем (членом) класса Test, а внутренние классы имеют полный доступ к полям внешнего класса. Модификатор final нужно использовать для _локальных_ переменных, используемых в анонимных классах.
PM MAIL   Вверх
freshAngel
  Дата 26.7.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Цитата(Evgeni68 @ 26.7.2009,  12:31)
Цитата(freshAngel @  26.7.2009,  11:55 Найти цитируемый пост)
Переменная "a" не имеет спецификатора final и вызывается из анонимного класса слушателя. Все работает в данном случае.

Переменная "a" является полем (членом) класса Test, а внутренние классы имеют полный доступ к полям внешнего класса. Модификатор final нужно использовать для _локальных_ переменных, используемых в анонимных классах.

Спасибо, понял.
Но что делать например вот в этом случае.
Код

public class NewClass {

public NewClass() {

final int a = 5;

final JButton button2 = new JButton();
JButton button = new JButton();
button.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
      a = 15; // Изменить значение переменной a нельзя, так - как эта константа!
      button2.setVisible(false); // А вот менять свойства можно...
      }
    });

}
}


После нажатия кнопки переменная a должна принимать значение 15
А из - за спецификатора final сделать это нельзя, так - как a является константой!
А если убрать final, то нельзя будет оперировать с локальной переменной из анонимного класса.
Что можно сделать в этом случае!?
Или только объявлять a полем класса Test!?

Это сообщение отредактировал(а) freshAngel - 26.7.2009, 16:36
PM MAIL   Вверх
Evgeni68
Дата 26.7.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 9.7.2007

Репутация: нет
Всего: 3



Цитата(freshAngel @  26.7.2009,  16:34 Найти цитируемый пост)
После нажатия кнопки переменная a должна принимать значение 15

Из приведенного примера абсолютно не ясен смысл таких манипуляций. Ведь область видимости данной переменной ограничена конструктором.
Если эта переменная участвует в какой-то логике и должна быть видна в других обработчиках действий - логично объявить ее полем класса.
PM MAIL   Вверх
dorogoyIV
Дата 26.7.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



пипец!!!
я так и думал!!!
эти долбанные IDE...
скоро надо будет на форуме ветку делать - отдельную - для тех, кто не пользуется IDE

я пишу в FAR, очень удобно
PM MAIL   Вверх
freshAngel
  Дата 26.7.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Цитата(dorogoyIV @ 26.7.2009,  20:04)
пипец!!!
я так и думал!!!
эти долбанные IDE...
скоро надо будет на форуме ветку делать - отдельную - для тех, кто не пользуется IDE

я пишу в FAR, очень удобно

dorogoyIV, как использование IDE связано с моим вопросом!?
Evgeni68, спасибо большое, вроде все понял!
PM MAIL   Вверх
dorogoyIV
Дата 27.7.2009, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



freshAngel
Цитата(freshAngel @  26.7.2009,  21:44 Найти цитируемый пост)
dorogoyIV, как использование IDE связано с моим вопросом!?

не туда написал, sorry  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.