Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов. / 17 сообщений из 17, страница 1 из 1
17.08.2016, 14:49
    #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
17.08.2016, 14:54
    #39293335
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
MAULER,

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

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

А дальше я не знаю как :(
Можете в рамках моего примера привести коротенький код?
...
Рейтинг: 0 / 0
17.08.2016, 15:08
    #39293352
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
MAULERПроблема в том, что у родного текстбокса и родного баттона разные по типу слушатели и я не могу вот так просто им "скормить" общий слушатель.
Создать промежуточный класс к которому привязывается общий слушатель и который устанавливает слушатели на "текстбокса и родного баттона" и транслирует их в события для "общего слушателя"
...
Рейтинг: 0 / 0
17.08.2016, 15:16
    #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
17.08.2016, 20:49
    #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
17.08.2016, 21:46
    #39293564
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
MAULER,
Тут надо многодумать).
События разные и это логично. Зачем тебе одно событие?
...
Рейтинг: 0 / 0
17.08.2016, 21:48
    #39293567
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
File brobser / выбор файла?
...
Рейтинг: 0 / 0
18.08.2016, 03:46
    #39293635
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
Petro123,

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

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

Как бы сделать так, чтоб при клике по кнопке в ЭТОМ случает обработчик сработал один раз?
...
Рейтинг: 0 / 0
18.08.2016, 10:48
    #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
18.08.2016, 10:52
    #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
18.08.2016, 11:15
    #39293774
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть собственный класс. Надо добавить слушателя на события двух внутренних компонентов.
MAULER,

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

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

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

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


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