Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 02:15   #1
AlkaloiD
Пользователь
 
Регистрация: 21.09.2010
Сообщений: 24
По умолчанию Как обратиться к компоненту на форме?

Написал класс наследник Frame, который создает окошко AWT. У него есть метода для создания различных компонентов. Компоненты создаются не в конструкторе класса, а вызываются соответствующие методы для их создания после инстанцирования класса.
Код:
public void createButton(int x, int y, int width, int height, String label)
{
	Button button = new Button(label);
	button.setSize(width, height);
	button.setLocation(x, y);
	this.add(button);
}
После добавления определенных компонентов нужно привязать к ним "слушателей". Подскажите как получить доступ к компонентам которые уже есть на форме?
Привязать сразу не получиться, т.к. все компоненты создаются по порядку, а обрабатывать они должны не один компонент. Есть вариант запихнуть в поля нужное кол-во компонентов, но это зверство, и не приемлемо.
AlkaloiD вне форума Ответить с цитированием
Старый 24.03.2011, 20:05   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Немного не ясна суть проблемы, почему, к примеру, нельзя передавать слушателя в ту же createButton? Ну в любом случае, для перечисления подконтрольных компонентов контейнера, можно использовать функцию getComponents()
Код:
void printButtonLabels() {
    Panel panel = (Panel)(this.getComponents()[0]);
    for (Component comp : panel.getComponents())
       if (comp instanceof Button)
          System.out.println(((Button)comp).getLabel());
}
Или что-то в таком роде, не проверял. Предполагается, что основным компонентом на форме лежит панель, на которой расположены все остальные кнопки. То есть вложенные панели и прочие контейнеры в данном примере не обходятся

Последний раз редактировалось netrino; 24.03.2011 в 20:08.
netrino вне форума Ответить с цитированием
Старый 24.03.2011, 20:44   #3
AlkaloiD
Пользователь
 
Регистрация: 21.09.2010
Сообщений: 24
По умолчанию

Возможно я туплю, но мне надо создать компоненты на форме не все сразу,а по очереди и естественно хотелось чтобы их кол-во (создаваемых) было "не ограничено". Отступление, я делаю лабораторную изучаем Java и применяем паттерны проектирования, для создания порождающего паттерна "Bilder" хотелось чтобы для каждого действия была свой метод в классе, чтобы применение паттерна было более менее оправдано.
Поэтому я хочу получить доступ к компонентам формы и добавить к ним слушателя(как говорил ранее, слушатель крепится не только кнопке но и к TextArea).

О, 2 раза спасибо! Вы единственный кто ответил, и очень понятно. Разобрал код, понял, создаем панель элементов которые нам возвращает форма, и ищем в цикле совпадение с кнопкой. Круто, спасибо!
Только 2 вопроса: я отключил "setLayout" я думаю из-за этого не чего страшного не произойдет? и второй сначала ругался, что "java.awtButton cannot be cast to java.awt.Panel", а потом и к "TextField", как я понял он не может преобразовать тип, что с этим можно сделать?

Исправил)
Код:
public void printButtonLabels()
{
	for (Component comp : this.getComponents())
	{
		if (comp instanceof Button)
		{
			System.out.println(((Button)comp).getLabel());
		}
	}
}
Спасибо большое)
как тебя поблагодарить? куда плюс поставить?)

Последний раз редактировалось AlkaloiD; 24.03.2011 в 20:55. Причина: код написал
AlkaloiD вне форума Ответить с цитированием
Старый 24.03.2011, 21:32   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Не стоит благодарности)
Про setLayout это конечно ничего, единственный минус - приходится самому заниматься расположением объектов, что, впрочем, Вы и так делаете, а часто именно это и бывает необходимо.
netrino вне форума Ответить с цитированием
Старый 25.03.2011, 01:25   #5
AlkaloiD
Пользователь
 
Регистрация: 21.09.2010
Сообщений: 24
По умолчанию

Почитал документацию к Java и нашел еще один способ который подходит для моего решения (может быть кому будет интересно).
Код:
Button button = (Button) frame.getComponentAt(x, y);
зная точные координаты, получаем доступ к компоненту. Но вариант с "обзыванием" компонентов (для Button - setLabel(String name), TextArea - setName(String name), TextField - setName(String name)) и дальнейшим поиском нужным компонентов + проверка по имени, будет универсальней)
AlkaloiD вне форума Ответить с цитированием
Старый 27.03.2011, 23:50   #6
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Капитан очевидность подсказывает что нужно хранить прямую ссылку на нужный компонент, как переменную экземпляра класса-наследника нужного компонента (фрейма, окна, панели и тд).
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 28.03.2011, 20:14   #7
AlkaloiD
Пользователь
 
Регистрация: 21.09.2010
Сообщений: 24
По умолчанию

Если я Вас правильно понял, то каждая функция, а их столько сколько нам возможно понадобиться различных компонентов, должна создавать объект нужного класса, добавлять ее на форму и как то сохранять ссылку на этот объект. Если так то, сохранить ссылку на данный объект, это сделать поле класса для этого объекта? Или я не так понял Вас..
AlkaloiD вне форума Ответить с цитированием
Старый 29.03.2011, 04:15   #8
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

В джаве нет функций.
Мне кажется все слишком усложняете, посмотрите какой код генерит редактор интерфейсов в нетбинсе.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 30.03.2011, 16:32   #9
AlkaloiD
Пользователь
 
Регистрация: 21.09.2010
Сообщений: 24
По умолчанию

Извиняюсь, метод или функция-член класса.
Слышал о том что в нетбинсе легко создаются окошки, но не ставил, не смотрел еще.
Спасибо за совет, посмотрю.
AlkaloiD вне форума Ответить с цитированием
Старый 10.04.2011, 20:01   #10
Caffeine
Новичок
Джуниор
 
Регистрация: 10.04.2011
Сообщений: 1
По умолчанию

Цитата:
this.getComponents()[0]
извините если задаю глупый вопрос,я просто начинающий в этом.
что значит "[0]" после метода?
Caffeine вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к уже созданным на форме label'ам в цикле? bemm Общие вопросы .NET 5 21.03.2011 17:44
обратиться к компоненту Memo, на активной вкладке PageControl dr.Chas Общие вопросы Delphi 11 29.04.2010 17:10
Почему из метода класса нельзя обратиться к компоненту на форме? Дима я Общие вопросы Delphi 2 28.03.2010 13:21
Как обратиться к активной форме? Dimon88 Помощь студентам 4 18.10.2008 00:03
как обратиться к невидемой форме Scorpeon Общие вопросы Delphi 3 29.06.2007 16:16