Разное

Обработка событий java: Java. Обработка событий

Содержание

Работа с событиями в Spring

Видеогайд

6 ноября 2021

Тэги: Kotlin, rest, Spring, Spring Boot, YouTube.

Содержание

  1. Публикуем событие
  2. Обрабатываем событие
  3. Выводы

Spring «из коробки» предоставляет простой механизм работы с событиями, которые позволяют уменьшить связность компонентов системы. Событие, которое возникает в одной точке приложения, может быть перехвачено и обработано в любой другой части приложения благодаря таким сущностям как publisher и eventListener.

Для примера рассмотрим rest-приложение на Kotlin, в котором есть некий метод с бизнес-логикой.

И мы хотим каждый вызов этого метода фиксировать. Чтобы не повышать связность кода и не делать явный вызов конкретного компонента, мы можем публиковать событие в нашей системе и любые компоненты, которые будут «прослушивать» тип такого события, смогут выполнить дополнительные действия.

Данный материал также доступен в формате видео на Youtube.

Создадим собственный тип события (data-класс), унаследовав его от стандартного класса ApplicationEvent.

data class BusinessEvent(
    val sourceObject: Any,
    val payload: String,
): ApplicationEvent(sourceObject)

У этого класса есть два поля:

  1. sourceObject для ссылки на объект, в котором возникло событие и который мы передаём в базовый класс события.
  2. payload — полезная мета-информация. В данном случае просто кидаем строку текста.

Теперь нам осталось подтянуть стандартный компонент

ApplicationEventPublisher в нужную нам точку приложения и опубликовать через него наше событие. Бизнесовый метод может выглядеть так:

@RestController
class BusinessController(
    val publisher: ApplicationEventPublisher,
) {
    @PostMapping
    fun create() {
        // бизнес-логика

        val event = BusinessEvent(
            sourceObject = this,
            payload = «Some information»
        )
        publisher.publishEvent(event)
    }
}

Здесь после выполнения бизнес-логики нашего метода выполняем публикацию события, которое содержит какую-то полезную информацию.

Для краткости здесь обработка происходит в контроллере, однако в реальных проектах вся бизнес-логика должна быть инкапсулирована в сервисном слое.

Теперь создадим сервис аудита, который будет «слушать» событие. Его интерфейс может выглядеть так:

interface AuditService {
    fun onBusinessEvent(event: BusinessEvent)
}

Тогда реализация примет следующий вид:

@Service
class AuditServiceImpl : AuditService {

    private val logger = LoggerFactory. getLogger(AuditServiceImpl::class.java)

    @EventListener(BusinessEvent::class)
    override fun onBusinessEvent(event: BusinessEvent) {
        logger.info(«Business event received: $event»)
    }
}

Мы можем повесить на любой метод аннотацию @EventListener и указать тип события, которое метод должен перехватывать. Разумеется, метод в качестве параметра должен принимать именно этот тип.

В нашем примере мы перехватываем событие типа BusinessEvent

и просто пишем в лог его содержимое. При этом любые другие события, возникающие в системе, мы перехватывать не будем.

Spring позволяет легко реализовать простейшую событийную модель в приложении. Прежде всего это снижает связность отдельных компонентов системы между собой. В дальнейшем такая архитектура позволит легко перейти на более «серьёзные» решения вроде полноценных очередей RabbitMQ или Kafka.


Облако тэгов

Kotlin, Java, Java 16, Java 11, Java 10, Java 9, Java 8, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.

Последние статьи

  • Список статей
  • Кеширование в Spring Boot
  • Springdoc для документации REST API
  • Работа с коллекциями в Kotlin и Java
  • Советы по работе с BigDecimal в Java
  • Алгоритм определения палиндрома
  • Удаление записи через DELETE-запрос в Spring Boot
  • Обновление записи через PUT-запрос в Spring Boot
  • Добавление записи через POST-запрос в Spring Boot
  • Работа с БД в Spring Boot на примере postgresql
  • Spring Boot Restful Service
  • Решето Эратосфена для поиска простых чисел
  • Алгоритм поиска простых чисел
  • Построчное чтение больших файлов на Java
  • Как сохранить текстовый файл на Java
  • Алгоритм чисел Фибоначчи на Java и Kotlin
  • Работа с системой контроля версий git из консоли
  • Бинарный поиск на отсортированном массиве
  • Как парсить HTML на Java с помощью Jsoup
  • Настройка Ubuntu под хостинг JVM приложения

НОУ ИНТУИТ | Лекция | Пакет java.

awt

< Практикум 2 || Лекция 11: 123456

Аннотация: Эта лекция начинает рассмотрение базовых библиотек Java, которые являются неотъемлемой частью языка и входят в его спецификацию, а именно описывается пакет java.awt, предоставляющий технологию AWT для создания графического (оконного) интерфейса пользователя – GUI. Ни одна современная программа, предназначенная для пользователя, не обходится без удобного, понятного, в идеале – красивого пользовательского интерфейса. С самой первой версии в Java существует специальная технология для создания GUI. Она называется AWT, Abstract Window Toolkit. Именно о ней пойдет речь в этой лекции. Пакет java.awt претерпел, пожалуй, больше всего изменений с развитием версий Java. Мы рассмотрим дерево компонентов, доступных программисту, специальную модель сообщений, позволяющую гибко обрабатывать пользовательские действия, и другие особенности AWT – работа с цветами, шрифтами, отрисовка графических примитивов, менеджеры компоновки и т. д. Хотя технология AWT включает в себя гораздо больше, чем можно изложить в рамках одной лекции, здесь собраны все необходимые сведения для создания полноценного оконного интерфейса.

Ключевые слова: Java, GUI, программа, производительность, AWT, Abstract Window Toolkit, слово, abstract, foreground, background, deprecated, monospace, пользовательское событие, radio button, splash screen, дерево, ООП, компонент, объект, event, garbage collector, параметр компонента, HTML, класс, инициализирующие действия, java script, координаты, приложение, пользователь, контейнер, интерфейс, фрейм, площадь, значение, controls, layout managers, место, шрифт, цикла, тег, апплет

Введение

Поскольку Java-приложения предназначены для работы на разнообразных платформах, реализация графического пользовательского интерфейса (GUI) должна быть либо одинаковой для любой платформы, либо, напротив, программа должна иметь вид, типичный для данной операционной системы. В силу ряда причин, для основной библиотеки по созданию GUI был выбран второй подход. Во-первых, это лишний раз показывало гибкость Java – действительно, пользователи разных платформ могли работать с одним и тем же Java-приложением, не меняя своих привычек. Во-вторых, такая реализация обеспечивала большую производительность, поскольку была основана на возможностях операционной системы. В частности, это означало и более компактный, простой, а значит, и более надежный код.

Библиотеку назвали AWT – Abstract Window Toolkit. Слово abstract в названии указывает, что все стандартные компоненты не являются самостоятельными, а работают в связке с соответствующими элементами операционной системы.

Дерево компонентов

Component

Абстрактный класс Component является базовым для всех компонентов AWT и описывает их основные свойства. Визуальный компонент в AWT имеет прямоугольную форму, может быть отображен на экране и может взаимодействовать с пользователем.

Рассмотрим основные свойства этого класса.

Положение

Положение компонента описывается двумя целыми числами (тип int ) x и y. В Java (как и во многих языках программирования) ось x проходит традиционно – горизонтально, направлена вправо, а ось у – вертикально, но направлена вниз, а не вверх, как принято в математике.

Для описания положения компонента предназначен специальный класс – Point (точка). В этом классе определено два public int поля x и y, а также множество конструкторов и вспомогательных методов для работы с ними. Класс Point применяется во многих типах AWT, где надо задать точку на плоскости.

Для компонента эта точка задает положение левого верхнего угла.

Установить положение компонента можно с помощью метода setLocation(), который может принимать в качестве аргументов пару целых чисел, либо Point. Узнать текущее положение можно с помощью метода getLocation(), возвращающего Point, либо с помощью методов getX() и getY(), которые появились с версии Java 1.2.

Размер

Как было сказано, компонент AWT имеет прямоугольную форму, а потому его размер описывается также двумя целочисленными параметрами – width (ширина) и height (высота). Для описания размера существует специальный класс Dimension (размер), в котором определено два public int поля width и height, а также вспомогательные методы.

Установить размер компонента можно с помощью метода setSize, который может принимать в качестве аргументов пару целых чисел, либо Dimension. Узнать текущие размеры можно с помощью метода getSize(), возвращающего Dimension, либо с помощью методов getWidth() и getHeight(), которые появились с версии Java 1.2.

Совместно положение и размер компонента задают его границы. Область, занимаемую компонентом, можно описать либо четырьмя числами ( x, y, width, height ), либо экземплярами классов Point и Dimension, либо специальным классом Rectangle (прямоугольник). Как легко догадаться, в этом классе определено четыре public int поля, с которыми можно работать и в виде пары объектов Point и Dimension.

Задать границу объекта можно с помощью метода setBounds, который может принимать четыре числа, либо Rectangle. Узнать текущее значение можно с помощью метода getBounds(), возвращающего Rectangle.

Видимость

Существующий компонент может быть как виден пользователю, так и быть скрытым. Это свойство описывается булевским параметром visible. Методы для управления – setVisible, принимающий булевский параметр, и isVisible, возвращающий текущее значение.

Разумеется, невидимый компонент не может взаимодействовать с пользователем.

Доступность

Даже если компонент отображается на экране и виден пользователю, он может не взаимодействовать с ним. В результате события от клавиатуры или мыши не будут получаться и обрабатываться компонентом. Такой компонент называется disabled. Если же компонент активен, его называют enabled. Как правило, компонент некоторым образом меняет свой внешний вид, когда становится недоступным (например, становится серым, менее заметным), но, вообще говоря, это необязательно (хотя очень удобно для пользователя).

Для изменения этого свойства применяется метод setEnabled, принимающий булевский параметр ( true соответствует enabled, false – disabled ), а для получения текущего значения – isEnabled.

Цвета

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

ru/2010/edi»>Компонент обладает двумя свойствами, описывающими цвета, – foreground и background цвета. Первое свойство задает, каким цветом выводить надписи, рисовать линии и т.д. Второе – задает цвет фона, которым закрашивается вся область, занимаемая компонентом, перед тем, как прорисовывается внешний вид.

Для задания цвета в AWT используется специальный класс Color. Этот класс обладает довольно обширной функциональностью, поэтому рассмотрим основные характеристики.

Цвет задается 3 целочисленными характеристиками, соответствующими модели RGB, – красный, зеленый, синий. Каждая из них может иметь значение от 0 до 255 (тем не менее, их тип определен как int ). В результате (0, 0, 0) соответствует черному, а (255, 255, 255) – белому.

Класс Color является неизменяемым, то есть, создав экземпляр, соответствующий какому-либо цвету, изменить параметры RGB уже невозможно. Это позволяет объявить в классе Color ряд констант, описывающих базовые цвета: белый, черный, красный, желтый и так далее. Например, вместо того, чтобы задавать синий цвет числовыми параметрами (0, 0, 255), можно воспользоваться константами Color.blue или Color.BLUE (второй вариант появился в более поздних версиях).

Для работы со свойством компонента foreground применяют методы setForeground и getForeground, а для background – setBackground и getBackground.

Шрифт

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

Для задания шрифта в AWT существует специальный класс Font, который включает в себя три параметра – имя шрифта, размер и стиль.

Имя шрифта задает внешний стиль отображения символов. Имена претерпели ряд изменений с развитием Java. В версии 1.0 требовалось, чтобы JVM поддерживала следующие шрифты: TimesRoman, Helvetica, Courier. Могут поддерживаться и другие семейства, это зависит от деталей реализации конкретной виртуальной машины. Чтобы узнать полный список во время исполнения программы, можно воспользоваться методом утилитного класса Toolkit. Экземпляры этого класса нельзя создать вручную, поэтому полностью такой запрос будет выглядеть следующим образом:

Toolkit.getDefaultToolkit().getFontList()

В результате будет возвращен массив строк-имен семейств поддерживаемых шрифтов.

В Java 1.1 три обязательных имени были объявлены deprecated. Вместо них был введен новый список, который содержал более универсальные названия, не зависящие от конкретной операционной системы: Serif, SansSerif, Monospaced.

В Java 2 библиотека AWT была существенно пересмотрена и дополнена. Чтобы устранить неоднозначности с разной поддержкой шрифтов на разных платформах, было произведено разделение на логические и физические шрифты.

Вторая группа определяется возможностями операционной системы, это те же шрифты, которые могут использовать другие программы, запущенные на этой платформе.

Первая группа состоит из 5 обязательных семейств (добавились Dialog и DialogInput ). JVM устанавливает соответствие между ними и наиболее подходящими из доступных физических шрифтов.

Метод getFontList класса Toolkit был объявлен deprecated. Теперь получить список всех доступных физических шрифтов можно следующим образом:

GraphicsEnvironment.
   getLocalGraphicsEnvironment().
   getAvailableFontFamilyNames()

Класс Font является неизменяемым. После создания можно узнать заданное логическое имя (метод getName ) и соответствующее ему физическое имя семейства (метод getFamily ).

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

Как и в случае имени шрифта, программист может указать любое значение размера, а JVM поставит ему в соответствие максимально близкий из доступных.

Наконец, последний параметр – стиль. Этот параметр определяет, будет ли шрифт жирным, наклонным и т.д. Если никакие из этих свойств не требуются, указывается Font.PLAIN (параметр имеет тип int и в классе Font определен набор констант для удобства работы с ним). Значение Font.BOLD задает жирный шрифт, а Font.ITALIC – наклонный. Для сочетания этих свойств (жирный наклонный шрифт) необходимо произвести логическое сложение: Font.BOLD|Font.ITALIC.

intuit.ru/2010/edi»>Для работы с этим свойством класса Component предназначены методы setFont и getFont.

Итак, мы рассмотрели основные свойства класса Component. Как легко видеть, все они предназначены для описания графического представления компонента, то есть отображения на экране.

Существует еще одно важное свойство другого характера. Очевидно, что практически всегда пользовательский интерфейс состоит из более чем одного компонента. В больших приложениях их обычно гораздо больше. Для удобства организации работы с ними компоненты объединяются в контейнеры. В AWT существует класс, который так и называется – Container. Его рассмотрение – наша следующая тема. Важно отметить, что компонент может находиться лишь в одном контейнере – при попытке добавить его в другой он удаляется из первого. Рассматриваемое свойство как раз и отвечает за связь компонента с контейнером. Свойство называется parent. Благодаря ему компонент всегда «знает», в каком контейнере он находится.

Дальше >>

< Практикум 2 || Лекция 11: 123456

Видео курс Java Professional. Обработка событий от интерфейсных элементов

№1

Введение

1:10:39

Материалы урокаДомашние заданияТестирование

В первом уроке вас ждет обзор технологии Java. Будут рассмотрены преимущества и недостатки Java в сравнении с конкурирующими технологиями. Также мы рассмотрим структуру простого Java-приложения, сделаем компиляцию и запуск Java-приложения. В завершении первого урока вас ждет знакомство со средой разработки IDE Netbeans.

Читать дальше…

Объектно-ориентированное программирование. Документирование программ

1:29:12

Материалы урокаДомашние заданияТестирование

В этом уроке будут рассмотрены такие понятия, как абстракция, инкапсуляция, пакетирование, классы, атрибуты, методы, конструкторы, пакеты. Вы получите ответы на вопросы, связанные с использованием модификаторов доступа (private и public). Узнаете о вызове методов объекта класса в Java. Также будут даны рекомендации по документированию программ.

Читать дальше…

Проектирование иерархии классов. Знакомство с UML

2:10:09

Материалы урокаДомашние заданияТестирование

В этом уроке мы рассмотрим основные принципы ООП: инкапсуляция, наследование, полиморфизм, поговорим о перегрузка и переопределении методов, использовании модификаторов доступа protected и default (package-friendly), конструкторов, создании нескольких конструкторов класса, процесс создания и инициализации объекта. Также вас ждет знакомство с UML, будет рассмотрено использование EasyUML для Netbeans, кодогенерация на основе диаграммы классов и обратный инжиниринг.

Читать дальше…

Особенности создания классов

1:45:08

Материалы урокаДомашние заданияТестирование

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

Читать дальше…

Рефакторинг. Типичные архитектурные решения и антипаттерны

1:10:25

Материалы урокаДомашние заданияТестирование

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

Читать дальше…

Обработка ошибок и исключений. Отладка, тестирование и профилирование

1:27:45

Материалы урокаДомашние заданияТестирование

Здесь мы поговорим об ошибках и исключительных ситуациях, от которых не застрахован ни один разработчик, и ни одно приложение, обсудим средства для их обработки, коснемся понятия оценки выражений, а также поговорим о средствам отладки и профилирования кода, которые предлагает IDE Netbeans. Второй важный момент, который мы обсудим – это понятие о тестировании ПО, Unit-тестирование, возможности по организации unit-тестирования и средства тестирования, которые предлагает наша любимая среда разработки.

Читать дальше…

Коллекции и дженерики

0:51:26

Материалы урокаДомашние заданияТестирование

В этом уроке мы поговорим о таком важном понятии, как коллекции, обсудим основные виды коллекций и интерфейсов, рассмотрим особенности гомогенных и гетерогенных коллекций, а также обсудим проблемы перебора всех элементов коллекции. Второй важный момент, который мы обсудим – это альтернативные библиотеки и дополнения для Java, позволяющие работать с коллекциями максимально эффективно.

Читать дальше…

Основы ввода-вывода

1:02:45

Материалы урокаДомашние заданияТестирование

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

Читать дальше…

Работа с консолью и файловой системой

0:51:13

Материалы урокаДомашние заданияТестирование

Этот урок является продолжением предыдущего, в котором мы говорили об основах ввода-вывода. Теперь же мы поговорим о более «приземленных» вещах – консольном вводе-выводе, работе с файлами, библиотеках для построения удобного текстового интерфейса пользователя. Стоит также провести аналогию между частью материала этого урока и следующими двумя уроками, в которых мы также будем говорим о построении пользовательского интерфейса, только теперь уже графическими средствами.

Читать дальше…

Создание графического интерфейса пользователя

1:35:24

Материалы урокаДомашние заданияТестирование

Этот урок является первым в серии уроков, посвященных разработке графических «настольных» приложений. В нем мы поговорим о JFC и Swing, обсудим имеющийся набор интерфейсных элементов и использование различных менеджеров разметки, а также сравним программный и визуальный способы построения графического интерфейса пользователя –средствами Matisse – одного из лучших (если не лучшего) из существующих на рынке конструкторов пользовательского интерфейса для Java. Стоит также отметить, что материал этого урока напрямую связан со уроками 11 и 14, в которых мы поговорим об обработке событий от интерфейсных элементов и о построении приложений на платформе Netbeans

Читать дальше…

Обработка событий от интерфейсных элементов

1:24:01

Материалы урокаДомашние заданияТестирование

Этот урок продолжает серию уроков, посвященных разработке графических «настольных» приложений. В нем мы поговорим об обработке событий от интерфейсных элементов, категориях событий, которые мы можем обрабатывать, рассмотрим понятие адаптеров событий, способы организации обработчиков, а также кратко обсудим вопрос распараллеливания обработки событий и создания рабочих потоков, который подробнее обсудим в следующем, двенадцатом уроке.

Читать дальше…

Многопоточность в Java

0:44:44

Материалы урокаДомашние заданияТестирование

Этот урок посвящен обсуждению важной и очень востребованной ныне темы – созданию многопоточных Java-приложений. Мы рассмотрим понятия потоков, подходы к их созданию, вопросы запуска и управления работающими потоками. Особое внимание будет уделено проблемам при работе нескольких потоков с общими данными, а также использованию методов wait и notify для управления потоками. Материал, рассмотренный в этом модуле, будет использован нами также при создании сетевых приложений и приложений на платформе Netbeans

Читать дальше…

Работа с сетью

0:49:47

Материалы урокаДомашние заданияТестирование

В ходе изучения материала этого урока мы обсудим некоторые аспекты работы с сетью в Java, а именно определим основные понятия, поговорим о сокетах, об использовании основных классов и интерфейсов пакета java.net, упомянем некоторые альтернативные средства создания сетевых приложений. Стоит отметить, что лабораторная работа этого урока является продолжением лабораторной работы предыдущего модуля. После ее выполнения вы получите полнофункциональный чат-сервер, и не менее функциональный чат-клиент, которые вполне могут стать основой для построения чего-то большего. Кстати, выполнение лабораторной работы продолжится в следующем уроке!

Читать дальше…

Разработка приложений для платформы Netbeans

0:47:11

Материалы урокаДомашние заданияТестирование

Этот урок является последним, и в ходе его изучения мы поговорим о проблемах разработки больших, профессионально выглядящих графических приложений с использованием готовой инфраструктуры — платформы Netbeans. Мы рассмотрим вопросы разработки как собственных модулей для этой среды, так и самостоятельных приложений — брендированных и снабженных программами установки. Также мы рассмотрим примеры других приложениях, написанных с применением рассматриваемой платформы, а также подведем итоги обучения и поговорим о том, что делать дальше и где искать ответы на свои вопросы.

Читать дальше…

Следующий курс:

SOLID принципы в Java

событий JavaScript

❮ Предыдущий Далее ❯


HTML-события — это «вещей» , которые происходят с элементами HTML.

Когда JavaScript используется на страницах HTML, JavaScript может «реагировать» на эти события.


События HTML

Событием HTML может быть действие браузера или пользователя.

Вот несколько примеров событий HTML:

  • Завершена загрузка веб-страницы HTML
  • Поле ввода HTML было изменено
  • Была нажата кнопка HTML

Часто, когда происходят события, вы можете захотеть что-то сделать.

JavaScript позволяет выполнять код при обнаружении событий.

HTML позволяет добавлять атрибуты обработчика событий с кодом JavaScript к элементам HTML.

С одинарными кавычками:

< элемент событие = некоторый JavaScript >

С двойными кавычками:

< элемент event = » JavaScript » >

В следующем примере атрибут onclick (с кодом) добавляется к

Попробуйте сами »

В приведенном выше примере код JavaScript изменяет содержимое элемент с.

В следующем примере код изменяет содержимое собственный элемент (используя this .innerHTML ):

Пример


Попробуйте сами »

Код JavaScript часто состоит из нескольких строк. Чаще можно увидеть атрибуты событий, вызывающие функции:

Пример

Попробуйте сами »



Общие события HTML

Вот список некоторых распространенных HTML-событий события:

Событие Описание
сменный Элемент HTML был изменен
по клику Пользователь щелкает элемент HTML
при наведении мыши Пользователь наводит указатель мыши на элемент HTML
Пользователь отводит указатель мыши от элемента HTML
нажатие клавиши Пользователь нажимает клавишу клавиатуры
под нагрузкой Браузер завершил загрузку страницы

Список намного длиннее: W3Schools JavaScript Reference HTML DOM Events.


Обработчики событий JavaScript

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

  • Действия, которые следует выполнять каждый раз при загрузке страницы
  • Что нужно сделать, когда страница закрыта
  • Действие, которое должно выполняться, когда пользователь нажимает кнопку
  • Содержимое, которое должно быть проверено, когда пользователь вводит данные
  • И еще…

Можно использовать множество различных методов, позволяющих JavaScript работать с событиями:

  • Атрибуты событий HTML могут напрямую выполнять код JavaScript
  • Атрибуты событий HTML могут вызывать функции JavaScript
  • Вы можете назначать свои собственные функции обработчика событий элементам HTML
  • Вы можете запретить отправку или обработку событий
  • И еще…

Вы узнаете намного больше о событиях и обработчиках событий в главах HTML DOM.


Проверьте себя с помощью упражнений

Упражнение:

Элемент

Начать упражнение


❮ Предыдущий Следующий ❯


NEW

Мы только что запустили
Видео W3Schools

Узнать

ВЫБОР ЦВЕТА
КОД ИГРЫ

Играть в игру




Top Tutorials
Учебник HTML
Учебник CSS
Учебник JavaScript
How To Tutorial
Учебник SQL
Учебник Python
Учебник W3.CSS
Учебник Bootstrap
Учебник PHP
Учебник Java
Учебник C++
Учебник jQuery

3 900 Справочник

3 900 Справочник по HTML
Справочник по CSS
Справочник по JavaScript
Справочник по SQL
Справочник по Python
Справочник по W3. CSS
Справочник по Bootstrap
Справочник по PHP
Цвета HTML
Справочник по Java
Справочник по Angular
Справочник по jQuery

Основные примеры
Примеры HTML
Примеры CSS
Примеры JavaScript
Примеры инструкций
Примеры SQL
Примеры Python
Примеры W3.CSS
Примеры Bootstrap
Примеры PHP
Примеры Java
Примеры XML
Примеры jQuery


ФОРУМ | О

W3Schools оптимизирован для обучения и обучения. Примеры могут быть упрощены для улучшения чтения и обучения. Учебники, ссылки и примеры постоянно пересматриваются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность всего содержания. Используя W3Schools, вы соглашаетесь прочитать и принять наши условия использования, куки-файлы и политика конфиденциальности.

Copyright 1999-2022 Refsnes Data. Все права защищены.
W3Schools работает на основе W3.CSS.

Основы обработки событий — Java Вопросы и ответы

Этот раздел из более чем 1000 MCQ по Java посвящен основам обработки событий в языке программирования Java.

1. Какой из этих пакетов содержит все классы и методы, необходимые для равномерной обработки в Java?
a) java.applet
b) java.awt
c) java.event
d) java.awt.event
Просмотреть ответ

Ответ: d
Объяснение. пользователь. Следовательно, они находятся в пакете Abstract Window Kit, java.awt.event.

2. Что такое событие в модели событий делегирования, используемой языком программирования Java?
а) Событие — это объект, описывающий изменение состояния в источнике
б) Событие — это объект, описывающий изменение состояния при обработке
в) Событие — это объект, описывающий любые изменения, внесенные пользователем и системой
d ) Событие — это класс, используемый для определения объекта, для создания событий
View Answer

Ответ: a
Объяснение: Событие — это объект, описывающий изменение состояния в источнике.

3. Какой из этих методов используется для регистрации прослушивателя событий клавиатуры?
a) KeyListener()
b) addKistener()
c) addKeyListener()
d) eventKeyboardListener()
Просмотреть ответ

Ответ: c
Объяснение: Нет.

Примечание. Присоединяйтесь к бесплатным классам Sanfoundry в Telegram или Youtube

реклама

реклама

4. Какой из этих методов используется для регистрации прослушивателя движения мыши?
а) addMouse()
b) addMouseListener()
c) addMouseMotionListner()
d) eventMouseMotionListener()
Просмотреть ответ

Ответ: c
Объяснение: Нет.

5. Что такое прослушиватель в контексте обработки событий?
а) Прослушиватель — это переменная, которая уведомляется при возникновении события
б) Прослушиватель — это объект, который уведомляется при возникновении события
в) Прослушиватель — это метод, который уведомляется при возникновении события
г) Ни один из упомянутый
View Answer

Ответ: b
Объяснение: Прослушиватель — это объект, который уведомляется о возникновении события. У него есть два основных требования: во-первых, он должен быть зарегистрирован в одном или нескольких источниках для получения уведомлений об определенных типах событий, а во-вторых, он должен реализовывать методы для получения и обработки этих уведомлений.

6. В какой из этих библиотек определен класс событий?
a) java.io
b) java.lang
c) java.net
d) java.util
Посмотреть ответ

Ответ: d
Объяснение: Нет.

7. Какой из этих методов можно использовать для определения типа события?
a) getID()
b) getSource()
c) getEvent()
d) getEventObject()
Просмотреть ответ

Ответ: a
Объяснение: getID() можно использовать для определения типа события.

реклама

8. Какой из этих классов является суперклассом всех событий?
a) EventObject
b) EventClass
c) ActionEvent
d) ItemEvent
Посмотреть ответ

Ответ: a
Объяснение: Класс EventObject является надклассом всех событий и определен в пакете java. util.

9. Какие из этих событий будут уведомлены при манипулировании полосой прокрутки?
a) ActionEvent
b) ComponentEvent
c) AdjustmentEvent
d) WindowEvent
View Answer

Ответ: c
Объяснение: AdjustmentEvent генерируется при манипулировании полосой прокрутки.

реклама

10. Какое из этих событий будет сгенерировано, если мы закроем окно апплета?
a) ActionEvent
b) ComponentEvent
c) AdjustmentEvent
d) WindowEvent
View Answer

Ответ: d
Объяснение: WindowEvent генерируется, когда окно активируется, закрывается, деактивируется, деиконфигурируется, отображается значок, открывается или закрывается.

Sanfoundry Global Education & Learning Series Язык программирования Java.

Чтобы попрактиковаться во всех областях языка Java, представляет собой полный набор из более чем 1000 вопросов и ответов с несколькими вариантами ответов .

Следующие шаги:

  • Получите бесплатный сертификат о заслугах в программировании на Java
  • Примите участие в конкурсе сертификации программирования на Java
  • Стать лидером в программировании на Java
  • Пройдите тесты по программированию на Java
  • Практические тесты по главам: глава 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  • Пробные тесты по главам: глава 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Категории Java MCQ

реклама

реклама

Подпишитесь на наши информационные бюллетени (тематические). Участвуйте в конкурсе сертификации Sanfoundry, чтобы получить бесплатный Сертификат отличия. Присоединяйтесь к нашим социальным сетям ниже и будьте в курсе последних конкурсов, видео, стажировок и вакансий!

Ютуб | Телеграмма | Линкедин | Инстаграм | Фейсбук | Твиттер | Пинтерест

Маниш Бходжасиа, ветеран технологий с более чем 20-летним стажем работы в Cisco и Wipro, является основателем и техническим директором компании Sanfoundry . Он живет в Бангалоре и занимается разработкой Linux Kernel, SAN Technologies, Advanced C, Data Structures & Alogrithms. Оставайтесь на связи с ним в LinkedIn.

Подпишитесь на его бесплатные мастер-классы на Youtube и технические дискуссии на Telegram SanfoundryClasses.

Обработка событий в Java для начинающих — Демонстрации Java

Вот краткое руководство по обработке событий в Java для начинающих. Этот учебник содержит все интерфейсы прослушивателя событий и классы, которые вам необходимо знать.

Введение

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

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

Ан класс событий содержит информацию о событии.

Источник события — это компонент или модель графического интерфейса, в которой генерируется событие или, другими словами, выполняется действие.

Класс адаптера — это абстрактный класс, реализующий интерфейс прослушивателя. Это важно, когда мы не хотим писать все обработчики . Например, интерфейс MouseListener содержит множество методов, таких как mousePressed() , mouseReleased() .. и мы хотим написать только один из них, мы используем класс адаптера. Этот класс реализует все методы интерфейса, предоставляя им пустое тело, в то время как сам является абстрактным.

Отправка событий

Для каждого действия пользователя создается соответствующий объект события. Этот сгенерированный объект события должен быть отправлен соответствующему слушателю, чтобы мы могли обработать это событие и написать соответствующий код. Процесс отправки объекта события соответствующему слушателю называется диспетчеризация событий. События не могут быть отправлены, если они не сгенерированы, и событие, за исключением MouseEvent , не может быть сгенерировано на отключенном компоненте.

Семантические и низкоуровневые события

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

 
java.awt.event.ComponentEvent 
                    |
                    +-- java.awt.event.InputEvent
                    | |
                    | +-- java.awt.event.MouseEvent
                    | +-- java.awt.event.KeyEvent
                    |
                    +-- java.awt.event.FocusEvent
                    |
                    +-- java.awt.event.ContainerEvent
                    |
                    +-- java.awt.event.WindowEvent

Семантические события являются зависимыми событиями, т. е. они зависят от событий нижнего уровня. Источники семантических событий могут быть моделью типа 9.0449 Таймер . Примеры включают ActionEvent, ItemEvent и т. д.

Классы событий и их иерархия

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

Не все компоненты GUI могут генерировать все типы событий. Например, Frame не может генерировать ActionEvent

Классы событий являются основой обработки событий. Они содержат информацию о сгенерированном событии. Нам нужно изучить их, прежде чем мы перейдем к концепции. AWT определяет классы событий, которые также используются в большинстве компонентов Swing.

 
java.util.EventObject
 
        |
        +-- java.awt.event.AWTEvent
                    |
                    +-- ActionEvent
                    +-- AdjustmentEvent
                    +-- AncestorEvent
                    +-- ComponentEvent
                   +-- HierarchyEvent
                   +-- InputMethodEvent
                   +-- javax.swing.event.InternalFrameEvent
                    +-- InvocationEvent
                    +-- ItemEvent
                    +-- TextEvent

Суперкласс всех событий — java. util.EventObject . Этот класс содержит метод getSource() , который возвращает источник сгенерированного события. Непосредственным подклассом EventObject является класс 9.0449 Класс AWTEvent , который является надклассом всех событий на основе AWT.

Примеры по каждому событию

ActionEvent

ActionEvent генерируется для различных компонентов AWT, таких как Button, TextField и т. д.

  1. Create ActionListener для кнопки AWT
  2. Создать ActionListener для AWT MenuItem
  3. Использование ActionListener для AWT TextField 
  4. Использование ActionListener для списка AWT
  5. Использование ярлыка для элемента меню AWT

Обычно это событие генерируется всякий раз, когда элемент выбран/отменен в списке или выборе.

Это событие генерируется при изменении текста текстового компонента, такого как TextField или TextArea .

Работа с событиями в Java

Работа с событиями в Java.

Java предлагает множество подходов к обработке событий, таких как анонимные классы и отражение. Эта статья покажет вам три способа начать работу с обработкой событий Java.

Александр Кальсавара

Основные API-интерфейсы Java, такие как Abstract Window Toolkit (AWT) и Swing, не говоря уже о Java Media Framework (JMF), архитектуре отладчика платформы Java (JPDA) и JavaBeans, сильно зависят от событий. События являются неотъемлемой частью платформы Java. В этой статье я представлю концепции приложений, управляемых событиями, и рассмотрю различные методы обработки событий. Затем я расскажу о некоторых общих методах, которые можно использовать для упрощения задачи обработки событий.


Терминология

Событие: Действие или событие, часто создаваемое пользователем, на которое программа может реагировать, например, на нажатия клавиш, щелчки кнопок или движения мыши.


Программирование с использованием событий
События существуют не только на платформе Java; они существовали до Java и были популяризированы графическими пользовательскими интерфейсами, такими как Windows и X Window System. Эти графически насыщенные системы управляются пользователем с помощью событий. В отличие от традиционной модели программирования, приложение управляет потоком программы. Этот поток предопределен операторами и условиями, которые закодированы ( Рисунок А ).
Рисунок А
Традиционный поток программы

Примером приложения такого типа является утилита командной строки. После вызова утилита выполняет свою функцию в зависимости только от подаваемых команд и в соответствии с закодированной логикой, независимо от каких-либо внешних факторов.

События не соответствуют этому традиционному подходу, поскольку они происходят вне контроля программы. Когда происходит событие, приложение уведомляется, что приводит к выполнению фрагмента кода (9).0451 Рисунок B ). Обычно это уведомление включает в себя вызов предопределенной процедуры или функции с передачей ей информации, достаточной для идентификации события, чтобы приложение могло выполнять свою логику.

Рисунок В
Поток программы с событиями

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

Эта модель программирования определяет управляемое событиями приложение , такое как интерактивное приложение, использующее графический интерфейс пользователя (GUI). Он реагирует только на действия пользователя (события), и действие, которое оно предпринимает, зависит от события. Кроме того, пользователь может нажимать кнопки, выбирать параметры и вводить что-либо в любое время и в любом порядке. По сути, события случайны — они происходят по усмотрению пользователя.

События и Java
В Java события генерируются объектами. Событие представлено Подкласс java.util.EventObject , несущий информацию о событии. Существуют подклассы для каждого вида событий. Как минимум, они содержат ссылку на объект, сгенерировавший событие ( источник события), но каждый подкласс определяет дополнительную информацию, соответствующую событию.

Например, объект javax.swing.JButton генерирует событие java.awt.event.ActionEvent при нажатии. Он создает экземпляр java.awt.event.ActionEvent 9.0450, заполняет его информацией о событии, включая ссылку на себя, и уведомляет заинтересованные стороны о событии.

Уведомление о событии
Механизм уведомления включает вызов определенного метода любых объектов, которые хотят получать уведомления о событии, и передачу объекта события в качестве параметра. Эти методы называются обработчиками событий . Чтобы объект был уведомлен о событии, он должен реализовать определенный интерфейс и быть зарегистрированным с источником события. Эти объекты называются прослушивателями событий .

Интерфейс, который должен реализовать объект, зависит от события, которое он хочет получить. Существуют интерфейсы для каждого вида событий, все они являются подинтерфейсами интерфейса java.util.EventListener . Каждый интерфейс определяет один или несколько методов, которые вызываются источником события. Каждый метод получает объект события в качестве параметра.

Обратите внимание, что интерфейс обычно определяет более одного метода, и несколько событий часто представляются с использованием одного и того же класса. Например, и нажатия клавиш, и отпускания клавиш генерируют события, но одного и того же класса, java.awt.event.KeyEvent используется для представления обоих. Хотя объект события всегда идентифицирует, какой тип события произошел, проще, если для каждого из них вызывается отдельный метод, чтобы вам не нужно было его тестировать.

Таким образом, соответствующий интерфейс для событий java. awt.event.KeyEvent , java.awt.event.KeyListener , определяет метод для нажатия клавиш, keyPressed , и другой для отпускания клавиш, keyReleased .

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

Обработка событий
Чтобы увидеть, как реализовать прослушиватели событий, рассмотрите пример в листинге A . Он содержит класс, расширяющий javax.swing.Jdialog , и реализует простое диалоговое окно с двумя кнопками, помеченными как Ok и Cancel. Обратите внимание, что класс также реализует интерфейс java.awt.event.ActionListener .

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

Анонимные классы
Мы рассмотрели наиболее традиционный и эффективный способ реализации обработчиков событий, но иногда он может быть громоздким, особенно когда вам нужно обрабатывать десятки элементов управления. Внедрение дополнительных интерфейсов и тестов может оказаться проблемой сопровождения. По этой причине программисты использовали альтернативные решения для облегчения диспетчеризации событий. Одним из самых популярных является использование анонимных классов для отправки события непосредственно в правильный метод (9).0451 Листинг B ).

Хотя этот метод удобен и прост в реализации, он не рекомендуется, за исключением очень простых случаев, поскольку для каждого события создается новый класс. Если вы рассматриваете приложение со сложным интерфейсом, количество этих небольших анонимных классов быстро растет. Это может замедлить работу пользовательского интерфейса, поскольку большинство загрузчиков классов загружают классы по требованию с диска. Пользователь может столкнуться с задержкой при создании окон и диалоговых окон во время загрузки классов.

Reflection
Другим распространенным подходом к обработке событий является использование API Reflection для написания универсального класса, который отправляет события в метод обработчика событий. В листинге C показан пример такого класса, который отправляет событий java.awt.event.ActionEvent . Он сохраняет сопоставление методов для вызова в зависимости от источника события. Любой метод экземпляра может быть вызван при условии, что он получает объект java.awt.event.ActionEvent в качестве параметра и объявлен общедоступным. В листинге D показан измененный фрагмент кода из листинга A с использованием класса диспетчера.

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

 

Заключение
Программирование, управляемое событиями, не является эксклюзивным для Java, но является ключевым компонентом этой платформы. Он предоставляет средства для разработки гибких приложений, в которых пользователь определяет ход выполнения программы. Реализация обработчиков событий в Java, как правило, проста, но важно знать, какой подход лучше всего подходит для той или иной ситуации. В этой статье мы рассмотрели три наиболее распространенных способа реализации обработки событий: отправка событий объекту, использование анонимного класса для отправки события непосредственно в метод, который его обрабатывает, и использование отражения для написания универсального класса, который отправляет события. события в метод обработчика событий.

Приглашенный автор

Опубликовано: . Изменено: Увидеть больше Разработчик Поделиться: Работа с событиями в Java
  • Разработчик

Выбор редактора

  • Изображение: Rawpixel/Adobe Stock ТехРеспублика Премиум

    Редакционный календарь TechRepublic Premium: ИТ-политики, контрольные списки, наборы инструментов и исследования для загрузки

    Контент TechRepublic Premium поможет вам решить самые сложные проблемы с ИТ и дать толчок вашей карьере или новому проекту.

    Персонал TechRepublic

    Опубликовано: Изменено: Читать далее Узнать больше
  • Изображение: Адоб Сток Инновации

    Gartner выделяет 25 новых технологий в цикле ажиотажа 2022 года

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

    Эстер Шеин

    Опубликовано: Изменено: Читать далее Увидеть больше Инновации
  • Изображение: BillionPhotos.com/Adobe Stock CXO

    Топ-10 поставщиков ERP 2022 г.

    Вы ИТ-менеджер или руководитель и пытаетесь найти нового поставщика ERP? Сравните лучшие программные решения ERP с нашим списком сегодня.

    Бренна Майлз

    Опубликовано: Изменено: Читать далее Увидеть больше
  • Изображение: яблоко. На WWDC 2022 Apple объявила о запланированном выпуске следующей версии своей операционной системы Mac, macOS Ventura, на осень 2022 года.
  • Изображение: elenabsl/Adobe Stock Программного обеспечения

    Лучшие учебные курсы и программные предложения TechRepublic Academy 2022 года

    Получите выгодные предложения на учебные курсы для разработчиков и Linux, лицензии Microsoft Office и многое другое благодаря этим предложениям Академии TechRepublic.

    Бренна Майлз

    Опубликовано: Изменено: Читать далее Увидеть больше Программное обеспечение
  • Изображение: iStock/фототехно Облако

    Объяснение Multicloud: шпаргалка

    В этом подробном руководстве рассказывается об использовании услуг от нескольких поставщиков облачных услуг, включая преимущества, которые получают предприятия, и проблемы, с которыми сталкиваются ИТ-отделы при использовании мультиоблачных сред.

    Мэтт Асай

    Опубликовано: Изменено: 908:00 16 августа 2022 г., 7:07 по тихоокеанскому времени Читать далее Увидеть больше Облако
Интерфейсы прослушивателя событий

— базовое руководство по Java для начинающих

  1. Вы здесь »

В этой статье мы узнаем о различных интерфейсах прослушивателя событий в Java, а также о методах, доступных в каждом из этих интерфейсов прослушивателя.

 

Модель делегирования событий содержит два основных компонента. Во-первых, это источники событий, а во-вторых, слушатели. Большинство интерфейсов прослушивателя доступны в пакете java.awt.event . В Java существует несколько интерфейсов прослушивателя событий, которые перечислены ниже:

ActionListener

Этот интерфейс работает с событиями действия. Ниже приведен метод обработки событий, доступный в интерфейсе ActionListener:

 

void actionPerformed(ActionEvent ae)

 

AdjustmentListener

2

3. Ниже приведен метод обработки событий, доступный в интерфейсе AdjustmentListener:

 

void AdjustmentValueChanged(AdjustmentEvent ae)

 

ComponentListener

 

Этот интерфейс работает с событиями компонентов. Ниже приведены методы обработки событий, доступные в интерфейсе ComponentListener:

 

void componentResized(ComponentEvent ce)

недействительный компонентMoved(ComponentEvent ce)

пустота componentShown(ComponentEvent ce)

void componentHidden(ComponentEvent ce)

 

ContainerListener

 

Этот интерфейс работает с событиями, которые могут генерироваться в контейнерах. Ниже приведены методы обработки событий, доступные в интерфейсе ContainerListener:

 

void componentAdded(ContainerEvent ce)

void componentRemoved(ContainerEvent ce)

FocusListener

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

 

void focusGained(FocusEvent fe)

void focusLost(FocusEvent fe)

ItemListener

Этот интерфейс работает с событием элемента. Ниже приведен метод обработки событий, доступный в интерфейсе ItemListener:

 

void itemStateChanged(ItemEvent ie)

 

KeyListener

0002  

Этот интерфейс работает с ключевыми событиями. Ниже приведены методы обработки событий, доступные в интерфейсе KeyListener:

 

void keyPressed(KeyEvent ke)

void keyReleased(KeyEvent ke)

void keyTyped(KeyEvent ke)

MouseListener

Этот интерфейс обрабатывает пять событий мыши. Ниже приведены методы обработки событий, доступные в интерфейсе MouseListener:

 

void mouseClicked(MouseEvent me)

void mousePressed(MouseEvent me)

void mouseReleased(MouseEvent me)

void mouseEntered(MouseEvent me)

void mouseExited(MouseEvent me)

MouseMotionListener

Этот интерфейс обрабатывает два события мыши. Ниже приведены методы обработки событий, доступные в интерфейсе MouseMotionListener:

 

void mouseMoved(MouseEvent me)

void mouseDragged(MouseEvent me)

MouseWheelListener

Этот интерфейс обрабатывает событие колеса мыши.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *