powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
17 сообщений из 17, страница 1 из 1
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293329
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Есть собственный класс, при создании экземпляра которого создаются текстовое поле (TextField) и кнопка (Button).
В этот класс мне надо добавить слушателя, который бы отлавливал ввод текста в TextField и/или клик кнопки Button.

Примерно это выглядит так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class MyClass {

    TextField tf = new TextField();
    Button btn = new Button ();
    
    public MyClass(){
    ...
    }

    public void addValueChangeListener(ValueChangeListener listener){
        tf.addValueChangeListener(listener);
        btn.addClickListener(listener);
    }

}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
MyClass myClass = new MyClass();
myClass.addValueChangeListener(new ValueChangeListener() {
            @Override
            public void valueChange(ValueChangeEvent valueChangeEvent) {
                 System.out.println("fire Event!");
            }

});



Т.е. при вводе текста или клике кнопки должно вывестись "fire Event!"
Проблема в том, что у родного текстбокса и родного баттона разные по типу слушатели и я не могу вот так просто им "скормить" общий слушатель.

Что делать?
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293335
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

Передать коллбэк, далее его вызывать в каждом листенере.
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293345
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,

т.е. внутри класса на текстовое поле добавить "родной" листенер и на баттон тоже добавить его родной листенер?

А дальше я не знаю как :(
Можете в рамках моего примера привести коротенький код?
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293352
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERПроблема в том, что у родного текстбокса и родного баттона разные по типу слушатели и я не могу вот так просто им "скормить" общий слушатель.
Создать промежуточный класс к которому привязывается общий слушатель и который устанавливает слушатели на "текстбокса и родного баттона" и транслирует их в события для "общего слушателя"
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293362
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

Что-то типа
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 public class MyClass {
   
  ...
  
  List<Общий слушатель> слушатели = ...

  void addОбщийСлушатель(ОбщийСлушатель ...
  
  void fireОбщееСобытие(...) {
   for (слушатель : слушатели) {
    ...
   }
  }

  ...

   btn.addClickListener(new СлушательКнопки(){
     @Override
     void onClick(...) {
      MyClass.this.fireОбщееСобытие(...);
     }
   }
  );
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293547
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев , зацените пожалуйста, так ли я Вас понял:

Код: java
1.
2.
3.
public interface CommonListener {
    void onChangeValue();
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
public class MyClass extends HorizontalLayout {

    TextField txt = new TextField();
    Button btn = new Button();

    private ArrayList<CommonListener> listeners = new ArrayList<CommonListener>();

    public MyClass(String caption){

        super();

        txt.setCaption(caption);
        txt.addValueChangeListener(new Property.ValueChangeListener() {
            @Override
            public void valueChange(Property.ValueChangeEvent valueChangeEvent) {
                MyClass.this.fireListeners();
            }
        });

        btn.setCaption(" > ");
        btn.addClickListener(new Button.ClickListener() {
            @Override
            public void buttonClick(Button.ClickEvent clickEvent) {
                MyClass.this.fireListeners();            }
        });

        this.addComponent(txt);
        this.addComponent(btn);

    }

    public void addCommonListener (CommonListener listener){
        listeners.add(listener);
    }

    public void removeListener(CommonListener listener) {
        listeners.remove(listener);
    }

    private void fireListeners(){
        for(CommonListener listener : listeners){
            listener.onChangeValue();
        }
    }

}



В вызывающем модуле:

Код: java
1.
2.
3.
4.
5.
6.
7.
        MyClass mc = new MyClass("Работа");
        mc.addCommonListener(new CommonListener() {
            @Override
            public void onChangeValue() {
                System.out.println("fire Listener!");
            }
        });
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293564
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,
Тут надо многодумать).
События разные и это логично. Зачем тебе одно событие?
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293567
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
File brobser / выбор файла?
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293635
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Юзер на форме вводит в строке поиска фрагмент выражения и может нажать просто
Enter или кнопку "найти" (" > ")
Для экземпляра класса, понимаемом в вызывающем
Модуле как единый компонент это должно выглядеть как одно событие.
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293689
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,
Согласен, тогда на выходе одно событие.
Если понадобится поиск при вводе букв, тогда надо будет два- onChange и onFind
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293708
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
А иногда и на onBlur приходится вешать и сравнивать со старым значением или генерить новое событие с задержкой от старого, если еще более нового не появилось. :)
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293709
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER Сергей Арсеньев , зацените пожалуйста,
Ну я б еще проверку на то, что добавляемый Listener не пуст добавил.
NPE в этом месте гораздо проще понять, чем когда неизвестно кто его добавил.
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293735
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

Всё вроде бы работает, но есть нюанс:
Когда я ввожу текст, при этом не нажимаю Enter или Tab, одним словом не покидаю фокус текстового поля. И кликаю мышкой по кнопке. В этот момент у меня обработчик срабатывает дважды. С одной стороны оно и логично: ведь отработал слушатель ввода текста (покинул фокус) и отработал слушатель клика кнопки. И вроде бы текст в поле один и тот же а обработалось два раза.

Как бы сделать так, чтоб при клике по кнопке в ЭТОМ случает обработчик сработал один раз?
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293751
boris_94263
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAULERPetro123,

Юзер на форме вводит в строке поиска фрагмент выражения и может нажать просто
Enter или кнопку "найти" (" > ")


Т.е. надо отлавливать не ввод букв, а нажатие на Enter в TextField? Тогда я бы сделал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class MyClass
{
    private TextField tf;
    private Button btn;

    public MyClass(EventHandler<ActionEvent> hdl)
    {
        // кроме прочего...
        
        this.btn = new Button(">");
        this.tf = new TextField();
        
        this.btn.setOnAction(hdl);
        this.btn.setOnAction(hdl);
    }
}



А в вызывающем модуле:
Код: java
1.
MyClass c = new MyClass(ae -> System.out.println("Event fired!"));



Или же речь именно об отлове символов, введённых в TextField?
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293757
boris_94263
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
boris_94263MAULERPetro123,

Юзер на форме вводит в строке поиска фрагмент выражения и может нажать просто
Enter или кнопку "найти" (" > ")


Т.е. надо отлавливать не ввод букв, а нажатие на Enter в TextField? Тогда я бы сделал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class MyClass
{
    private TextField tf;
    private Button btn;

    public MyClass(EventHandler<ActionEvent> hdl)
    {
        // кроме прочего...
        
        this.btn = new Button(">");
        this.tf = new TextField();
        
        this.btn.setOnAction(hdl);
        this.btn.setOnAction(hdl);
    }
}



А в вызывающем модуле:
Код: java
1.
MyClass c = new MyClass(ae -> System.out.println("Event fired!"));



Или же речь именно об отлове символов, введённых в TextField?

Конечно же там в конструкторе this.tf.setOnAction(hdl) - ошибся.
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293774
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

Проверить, что изменения реально были. :) Т.е. строка не такая как и была.
С другой стороны , если нужно будет реально обрабатывать два события при двух нажатиях клавиши, но надо будет еще вводить проверку, мол с прошлого раза прошла секунда или еще как. :)
...
Рейтинг: 0 / 0
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
    #39293782
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

На самом деле мне нужно отлавливать не сам набор символов, а нажатие кнопки Enter в текстовом поле.
т.е. Пользователь может набрать слово и не заморачиваясь нажать тут же Enter, или заморочиться и нажать Enter.

В любом случае должно сработать одно событие, не два.

Но я вроде бы решил вопрос. Воспользовался этим примером.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]