Понимание Gui и Слушателей - PullRequest
       1

Понимание Gui и Слушателей

0 голосов
/ 07 сентября 2011

Я хотел бы задать вам пару вопросов о Gui.

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

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) - Кто-то нажимает кнопку - Как программа узнает, чтобы активировать widgetSelected? Я вижу, что кнопка добавила слушателя ButtonHandler к себе, но почему нажатие кнопки, а не просто нажатие на поле отправит событие ButtonHandler? Я не могу видеть, где только слушатель отправил этому слушателю.

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 07 сентября 2011

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 07 сентября 2011

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

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

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

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

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

...