Модуль 3. Разработка современного пользовательского интерфейса на JavaFX — КиберПедия 

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Модуль 3. Разработка современного пользовательского интерфейса на JavaFX

2022-10-10 62
Модуль 3. Разработка современного пользовательского интерфейса на JavaFX 0.00 из 5.00 0 оценок
Заказать работу

Итак, наша следующая тема – этоJavaFX. Дело в том, что документация JavaFXидет отдельно. Документация JavaFXсостоит из разных версий. Есть JavaFX 2, а есть JavaFX 8. Так что будьте аккуратны, т.к. это последняя документация.

//JavaFX   http://www.oracle.com/technetwork/java/javase/downloads/index.html http://docs.oracle.com/javafx/2/installation_2-2/jfxpub-installation_2-2.htm   http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-architecture.htm#CHDFDAFF http://docs.oracle.com/javase/8/javase-clienttechnologies.htm http://docs.oracle.com/javafx/2/get_started/jfxpub-get_started.htm   //описание классов http://docs.oracle.com/javafx/2/api/index.html?javafx/scene/\class-useSceneBuilder.html   //развертывание приложений http://docs.oracle.com/javafx/2/deployment/jfxpub-deployment.htm   //javaFX 8 http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-overview.htm#JFXST784

Это очень развивающаяся технология и очень быстро обновляются версии.

История GUI.

AWT

Итак, о чем пойдет речь? Мы хотим сделать пользовательский интерфейс, а это ведь Java. Он должен быть кроссплатформенный. Это значит вы написали один раз программу, которая работает на всех ОС. Вы представляете себе, какая это сверхзадача? И ребята собрались где-то в 1993 году и они спросили себя, а как это вообще сделать? Один раз написано и работает везде. Подходы могут быть совершенно различные и то, что они выбрали – это первая версия «AWT» - AbstractWidgetToolKit.

И то, что они в первой версии предложили звучит примерно так. Они сказали: «а давайте мы найдем все то общее что есть на разных ОС». Ну наверно есть что-то общее? Например, кнопка. Ну ведь на всех ОС есть кнопка? Если мы сделаем кнопку, значит на любой ОС она есть и ее можно будет нарисовать. Как вы думаете много ли общих элементов на всех ОС? Они нашли всего 10 штук. Там буквально по пальцам двух рук можно пересчитать элементы управления в AWT.

А теперь такой вопрос: Хорошо, мы нашли все то общее, что есть на всех ОС. Кто эту кнопку рисовать будет? Мы (Java)или ОС? Так вот они так и сказали: «а вот пусть ОС ее и рисует». Поэтому считайте, что библиотека AWT, ее архитектура выглядит очень оригинально. У нас есть класс Button, которому в пару написан класс под названием ButtonPeer. Не ищите в документации ButtonPeer, он уходит в native-code. Нам это не нужно, т.к. это часть архитектуры, но в документации где-то на него иногда при подробном описании классов Buttonесть, что в паре с ним работает ButtonPeer. Т.е. когда вы что-то делаете с кнопкой, создаете объект, настраиваете, у него там какие-то надписи, обработчик захотим, чтобы он при клике срабатывал. Нам же это все нужно. Так вот этот ButtonPeerвсю эту информацию передает в ОС и ее просит нарисовать то, что мы у себя создали, раскрасили и настроили. ButtonPeerим пришлось написать под каждую ОС. Ведь они же разные. Я должен сказать каждой ОС по-разному. И поэтому пришлось по одному Button писать под все платформы. Ну что сделаешь? Выбрали какую-то версию архитектуры и вперед. Зато вы видите на экране, когда запускаете программу native-интерфейс – это делает ОС.

Конечно, это небогатое количество элементов управления расстраивает. И как вы думаете, можем ли мы расширить это? Иметь возможность написать что-то свое? Создать новый элемент управления, например. Можно ли в AWTнаписать свой собственный элемент управления? Если вы это сделаете, то потом под каждую ОС мне нужно будет написать Peer. Даже если вы под одну ОС напишете и то будет хорошо, но вы теряете кроссплатформенность. Поэтому здесь нет такой возможности расширения, создания новых элементов управления. Поэтому библиотека получилась скудная, и скажем честно – никто ей не пользуется уже давно.

А мы будем программировать в этой архитектуре. Почему? А дело в том, что они в этой библиотеке AWTсо второй попытки сделали очень хорошую обработку событий. И эта обработка событий используется дальше в следующей библиотеке – «Swing».Соответственно, для этой библиотеки уже не разрабатывали вот эту всю архитектуру обработки событий. Почему? Потому что ее взяли из AWT.И мы напишем простенькую программу. И именно на примере этой простой программы – не важно в какой она архитектуре, пусть AWT– мы посмотрим именно обработку событий, как это все было задумано. В последующих библиотеках, конечно, события может и обрабатываются с дополнительными надстройками, но основа остается той же. И на примере AWTмы увидим ее без всяких лишних «украшений» и без всяких дополнительных кусков кода.

Итак, создаем новый проект. Назовем его именем библиотеки – AWT. Нам сгенерировали класс, который мы тысячу раз уже видели. Что с ним делать? Годится ли он нам для того чтобы мы могли писать код? Годится. Что первое видит на экране пользователь, когда запускает программу с интерфейсом? Что на экране появляется? Какое-то замечательное окно, которое называется главным. Естественно в AWT, как и в любой другой библиотеке, уже существует готовый класс главного окна Frame. И если вы хотите, чтобы он появился, то надо от него наследовать, сделать свои собственные настройки, создать объект и сказать: «Работай!». Итак, наследуем от этого класса.

И сразу по лампочке нажимаем и добавляем оператор импорта.

Я не думаю, что мы будем еще что-то из AWTнепосредственно использовать. Но второй пакет мы добавим руками.

Т.к. мы с событиями будем работать плотно, то классов нам может потребоваться несколько. Вот именно этот раздел awt.eventиспользует библиотека Swing. Если я хочу увидеть формочку на экране сейчас, то надо создать объект нашего класса. Как это делается – вы знаете.

Можно поставить сразу «точку» и написать метод show().

Но мы видим, что метод show() устарел. Тогда мы не будем его писать, т.к. он deprecated. Давайте поищем setVisible().

А этот не зачеркнут. Другое дело. Пожалуйста! Вот написанная вами первая оконная программа.

Работает?

Супер! Мы могли ей придумать заголовок. Размер начальный задать, чтобы она не была в начальном свернутом состоянии. Закрывайте её. Придется закрывать эту программу вот этой красной кнопочкой, потому что здесь не предусмотрен функционал.

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

Получилось у всех? Отлично!

Давайте перед тем, как мы реализуем закрытие программы, сначала настроим размер окна, надпись. А то она появляется в левом верхнем углу. Как-то это не очень.

Давайте в этот класс AWT добавим конструктор! Я же должен какие-то настройки делать для объектов. Ну это разумно как всегда в конструкторе. Пусть он publicбудет. Мне не жалко. Имя конструктораAWT.

Итак, в теле конструктора, что мы хорошего сделаем для этого объекта? Сразу размер нужно изменить! У нас в Javaпринято так: get – прочитать; set – изменить. Значит пишу setи ищу здесь что-нибудь культурное связанное с размерами. setSize().

А еще есть возможность установить надпись – setTitle()

Понятно, что в строке заголовка появится это название.

Ну так уже лучше.

Кстати, setVisibleсюда тоже можно убрать.

Пора бы реализовать закрытие программы.

Как заставить работать крестик? Создать событие. Любой элемент на экране от кнопки до главного окна является теми самыми издателями, паттерн которого мы разбирали с вами на прошлом занятии. Все элементы управления являются издателями. Вы не поверите сколько у них событий! Штук 30-50 в зависимости от элемента! Код издателя уже готовый! Помните мы писали целый класс, а потом подписывались на события. Здесь издатель все полностью необходимое внутри себя содержит. И если код издателя сделан, то что вы должны сделать, чтобы получать события? Вы должны подписаться и сказать: «вот я такой хороший, и я хочу получать это событие». Ничего сложного. И методы, которые отвечают за подписку на события в этих библиотеках AWTи Swing– они одинаковы. И называются они следующим образом: «addИмяСобытияListener». Где Listenerявляетесь вы – подписчиком. Поэтому мы сейчас пишем: this.addи поглядите сколько их!

Нам нужно событие, которое означает закрытие окна. addKeyListener? addMouseListener? addWindowListener? кого?

Конечно addWindowListener! Это событие связано с окном. В принципе понятно, что когда вы начинаете профессионально пользоваться какой-то библиотекой, то вам придется прочитать все про события, чтобы вы могли представлять возможности, посмотреть все элементы управления.

А в скобочках должен быть ваш обработчик на это событие. Ну считайте, что его нет. Кстати, когда я сказал, что в AWTмало классов, то, конечно, я был неправ. Вот смотрите. У нас AWT. Берем Button. И беру от кого они наследуют. Вот здесь есть такой класс Component. Вот посмотрите сколько классов наследует этот компонент:Button, Canva, CheckBox, Choice, Label, List, ScrollBar, TextComponent – вот и всё. Не разгуляешься. Но это была первая попытка, зато хорошая.

Итак, как можно получить обработчик на события? Вы должны реализовать какой-то служебный интерфейс.

Кстати, тоже красивое решение. Чтобы вам не искать как называется интерфейс, то интерфейс всегда называется вот так: addWindowListener. Вот и имя интерфейса. Вот любой addListener. addубрали – это имя интерфейса, которое вы должны, как клиент реализовать, чтобы подписаться на событие. Удобно же? Его искать не надо. Все перед глазами. Т.е. мы должны реализовать интерфейс WindowListener. Не вопрос.

Вопрос только где? Я могу предложить только три варианта.

· напишем отдельный класс в отдельном файле;

· я могу сделать класс, который внутри класса AWT, т.е. это будет внутренний класс;

· а можно сгенерировать анонимный класс.

Ответ из зала: Давайте анонимный.

Вопрос от препода: Почему анонимный лучше? Хорошо, что вы первый вариант не предложили. Первый действительно не очень хороший. Вообще лучше делать внутренний класс. Мне-то не жалко сделать анонимный класс. Просто вы сейчас увидите, что будет. Хорошо? Готовы?

Вопрос: Как вы думаете, сколько в этом интерфейсе методов, которые нужно реализовать? Больше одного, а именно 7. Мы пишем newWindowListener.

Система сама уже все сгенерировала. Как вы сказали? Компактно? Такой анонимный класс нам не нужен. J

Важно, что здесь 7 событий. А на сколько событий из них вы хотите реагировать? На одно. А реализовать интерфейс вы не можете, оставив только одну реализацию. Вам все 7 надо делать. И вот этот момент получается неудобный. Я хочу коротко, а мне надо реализовывать 7 методов, а из них 6 будут заглушки. Разработчики знали, что будет такая проблема и они на все свои интерфейсы написали классы, которые эти интерфейсы реализуют, но в варианте заглушек. Просто пустые фигурные скобки. Есть класс, где все их 7, но с пустыми фигурными скобками. И эти интерфейсы всегда называются ИмяAdapter, чтобы вам было удобно. Он адаптирован под нас. Так что это я стираю и пишу newWindowAdapter. Единственно, что нам добавили фигурные скобки. Как бы предполагается, что если внутри что-то надо, то мы сами это реализуем. Вы сделайте пустую строчку и на пустой строчке нажмите Ctrl+Пробел.

И вот все те виртуальные функции, которые можно переопределить, они теперь перед вами. Что нам надо переопределить? Выбирайте. windowClosingили windowClosed. windowClosedконстатирует факт, что окно закрылось, а нам надо участвовать в процессе. Поэтому windowClosing и нажимаем Enter.

Все что зачёркнуто стираем. Итак, мы должны закрыть приложение.

System.exit(0);

И здесь мы не можем использовать лямбда-выражение. Там семь методов. Это минимальное количество строк, которое мы можем написать. Но зато мы справились и у нас все закрывается. Подписка на событие понятна? Завтра мы должны сделать эту программку чтобы в ней можно было мышкой рисовать. И всё. Будет еще обработка событий от мыши. Но здесь через анонимный класс уже не получится сделать. И тут вам нужно будет подумать. Там получается нужно два интерфейса зацепить. Если сейчас я здесь напишу this, то там для того, чтобы вы могли рисовать мышкой надо делать два add. Первый add– это mouseListener, а второй mouseMotionListener. Колесико мы не будем брать. Эти два обязательно идут вместе. А если я буду использовать объект анонимного класса и каждый раз писать newОбъект. Их будет два. А я хочу сделать один объект, который будет подписан на оба интерфейса. Поэтому нам надо будет либо отдельно писать класс, либо делать внутренний класс вклассе AWT. Завтра скажете.


Поделиться с друзьями:

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.033 с.