Понимание графического интерфейса и слушателей

StackOverflow https://stackoverflow.com/questions/7325645

Вопрос

Я хотел бы задать вам пару вопросов о графическом интерфейсе.

Я видел следующий пример:

public class ShellWithButton {
    public static void main(String[] args) {
    Display display = Display.getDefault();
    Shell shell = newShell (display);
    Button ok = newButton (shell, SWT.PUSH);
    ok.setText ("Push Me!");
    ok.addSelectionListener(new ButtonHandler());
    ok.setLocation(0,0);
    ok.setSize(100,30);
    shell.pack ();
    shell.open ();
    while(!shell.isDisposed ()) {
     if(!display.readAndDispatch())
         display.sleep ();
          }
       display.dispose ();
        }
    }    

public class ButtonHandler 
 implements SelectionListener {
   public void widgetSelected(SelectionEvent e) {
       if(e.getSource() instanceofButton) {
          Button b = (Button) e.getSource();
          b.setText("Thanks!");
      }
   }
public voidwidgetDefaultSelected(SelectionEvent e){
 // TODO Auto-generated method stub
   }
 }

(i)- Кто-то нажимает кнопку- как программа знает, чтобы активировать виджеты? Я вижу, что кнопка добавила кнопку прослушивателя ButtonHandler к себе, но почему это нажатие кнопки, а не просто нажатие на поле отправит событие ButtonHandler? Я не вижу, куда был отправлен только толкание этому слушателю.

(ii)-Почему я отправляю экземпляр ButtonHandler слушателям? что это значит?

(iii)- Что происходит, когда я нажимаю кнопку? Что это за событие? Событие - это экземпляр самой кнопки?

(iv)- Button b = (Button) e.getSource(); Зачем мне этот кастинг источника? Событие, как было написано, может прийти только из OK, который является экземпляром кнопки.

(v)- Почему эта оригинальная кнопка изменит свое заголовок? Мы меняем Б.

Большое спасибо!

Это было полезно?

Решение

  1. Когда кто -то нажимает кнопку, кнопка вызывает widgetSelected()Потому что так была разработана библиотека; Это должно вызвать какой -то метод, чтобы вы могли что -то сделать, и они установили этот метод. Причина, по которой он называет ваш widgetSelected() потому что вы дали ему свой класс, чтобы позвонить. Кнопка знает, что у вашего класса естьwidgetSelected() метод, потому что вы реализовалиSelectionListener, и это требует от вас внедритьwidgetSelected() метод Это сама причина для интерфейсов, и я предлагаю вам прочитать на них. Только нажатие кнопки заставит кнопку для вызова вашего метода, потому что кнопка знает только тогда, когда она нажимается. Когда есть щелчок на экране, рассказываются только виджеты, которые должны знать об этом.

  2. Как я упоминал выше, вы отправляете своего обработчика на кнопку, чтобы он знал, что делать, когда он нажимается.

  3. Когда кнопка нажимается, она должна сообщить вашему обработчику, что произошло, и поэтому вся соответствующая информация предоставляется вам какSelectionEvent. Анкет Само событие не является кнопкой, но событие говорит вам, какая кнопка нажата, если вы хотите, чтобы один и тот же обработчик обрабатывал более одной кнопки.

  4. Вам нужен актерский состав, потому что ваш widgetSelected() Метод может быть вызван, когда что -то происходит со всевозможными объектами GUI, а не только кнопками. Поэтому источник дается как какой -то суперкласс, общий для всех виджетов, которые могут вызвать ваш метод, и вам нужно отбрасывать его на кнопку, когда вы уверены, что это ваша кнопка. Да, в этой программе это может быть вызвано только кнопкой, но это не всегда так.

  5. Текст кнопки изменяется, потому что B и созданная и отображаемая кнопка - один и тот же объект. Объекты (и массивы) в Java являются «указателями», они говорят вам, где находится объект. Когда вы назначаете один объект другой переменной, вы не копируете объект, вы просто используете другую переменную, чтобы указывать на один и тот же объект.

Другие советы

(я) GUI обычно использует Образец наблюдателя, в котором один или несколько объектов подписываются на событие, и всякий раз, когда это событие происходит, он отправляется на все подписанные объекты, как в случае кнопки.

(ii) Вы отправляете экземпляр слушателям, чтобы связать их, чтобы они могли получить событие, когда это необходимо.

(iii) Что происходит, так это то, что событие заставляет наблюдателей получать уведомление о том, что ваша кнопка была нажата, что в конечном итоге приводит к выполнению некоторого кода. Само событие является не экземпляром кнопки, а скорее отдельным экземпляром для обработки событий.

(iv) Вам нужно отменить его, потому что подпись метода просто общая, поскольку она используется для нескольких типов событий.

(v) Он изменил свой заголовок, поскольку, используя шаблон наблюдателя, наблюдатель в этом случае ваша кнопка была уведомлена, когда произошло событие, которое нажимало кнопку.

(i) Идея «слушателей» заключается в том, что вы хотите предоставить список компонентов, объектов, программных модулей и т. Д., Которые будут уведомлены об этом событии. Причина, по которой кнопка нажатия не просто запускает что -то, заключается в том, что что -то должно слушать это событие, чтобы отреагировать на него. Любой объект, реализующий соответствующий интерфейс прослушивателя (в зависимости от типа события), может быть добавлен и, следовательно, обрабатывать событие.

(ii) Это обратный вызов. Вы должны сказать слушателю: «Вот экземпляр объекта, который может справиться с вашими событиями. Пожалуйста, добавьте его в список объектов, которые будут уведомлены». Это похоже на подписку на RSS -канал, в некотором смысле - все в списке получают обновление, когда это происходит.

(iii) Событие является отдельным объектом. Система окон (которая на некотором глубоком уровне подключается к оконной библиотеке базовой ОС) создает объект события, а затем спускается в список зарегистрированных слушателей, уведомляя каждого из них. Есть некоторые исключения из этого (например, слушатель может поглотить событие, не давая никому в списке, но это отдельный собственный вопрос)

(iv) потому что getsource () возвращает экземпляр компонента. Если вы хотите иметь возможность получить доступ к методам, специфичным для кнопок (что сделано в следующей строке, с setText, Вы должны иметь дело с экземпляром кнопки для этого метода, чтобы узнать, что делать (т. Е. Какое класс для работы).

(v) Кнопка не меняет его заголовок - ButtonHandler делает это. Таким образом, когда виджет выбирается, метод «Виджета» вызывается внутри ButtonHandler. Затем он проверяет источник события (который предоставляет ссылку на исходную кнопку), а затем обновляет текст кнопки, чтобы отразить, что ее нажали.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top