Как сделать приложение на java

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

(Дальше много картинок!)

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

Первый — GUI для Java есть трёх видов (библиотек): AWT, Swing (кто придумывает такие названия?) и JavaFX.

На сегодняшний день (Java 8 и 9) все они входят в комплект поставки JDK: то есть всё работает из коробки и не нужно заморачиватся с их установкой. Это большой плюс.

Но, AWT — это первая и очень старая реализация, поэтому её использовать не нужно. В общем — некошерно. Swing — тоже некошерно, поскольку там что-то не так замутили и программы из-за него жутко тормозят. Точнее не скажу, не разбирался, но вроде как она официально больше не развивается несколько версий. А вот JavaFX — это гуд и наше светлое будущее.

Так что единственное на что стоит потратить время — это JavaFX.

  • запускаем Delphi;
  • автоматом создается новый проект с главной формой;
  • выбираем на палитре компонентов кнопку и размещаем на форме; всё визуально
  • аналогично кидаем на форму текстовое поле;
  • при необходимости в панели свойств можно указать текст кнопки, размеры и т.п.;
  • запускаем — Delphi предложит сохраниться, сохраняемся.

То есть мы не написали ни единой строчки кода, IDE — всё сделала сама. Если посмотреть на сгенерированный код, то назвать его простым нельзя — здесь уже требуются определенные знания, но Delphi достаточно умна, чтобы понимать как с ним работать.

  • два раза кликаем на кнопку (или выбираем событие onClick);
  • Delphi создает код обработчика этого события и перекидывает нас в редактор;
  • набираем название текстового поля и Delphi выдает подсказки, по которым можно соориентироваться что и как делать.

Визуальное программирование в Delphi

То есть опять же, IDE выполнила всю черновую работу.

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

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

Ява должна быть установлена на компе. Я не буду приводить ссылки как это сделать — гугл в помощь, поскольку всё слишком просто.

В Яве нет какой-то одной программы — среды разработки, поэтому в Сети встречаются примеры из разных программ. Самые примитивные, вроде Notepad++ годятся только для консольного вывода, но если рассматривать что-то более серьёзное, то выделяются только три кандидата: NetBeans, Eclipse и IntelliJ IDEA.

NetBeans — самая простая программа, которая быстро (относительно остальных) запускается и довольно сносно работает.

Eclipse — тоже неплохой вариант, более мощный чем NetBeans, но слабее чем IntelliJ IDEA.

IntelliJ IDEA — выглядит самой крутой, но за это приходится платить скоростью работы. Стоит отметить, что Android Studio базируется на IntelliJ IDEA, но студия работает почему-то значительно медленней.

Важный момент связан с программированием под Андроид. Из этих трех IDE только IntelliJ IDEA для этого более-менее годится. В Сети масса материалов о программировании под Андроид в Eclipse, но они все уже устаревшие — не тратье время, запуская старенький ADT-плагин и пытаясь хоть что-то с ним сделать. Может быть старый Android SDK и будет работать, но все новые — уже нет.

Я покажу как сделать приложение FXML JavaFX во всех трёх программах, но прежде чем приступать, нужно установить ещё одну программу: SceneBuilder (используйте версию для Java 8). Это ключевая программа, где, собственно и выполняется всё визуальное построение. SceneBuilder самостоятельно может работать без IDE, поэтому можете её запустить и посмотреть как она устроена. На выходе будет fxml-файл, который содержит всю нужную разметку. Этот файл и используется в IDE, вместо написания мегатонны кода. :-)

В каждой программе вам нужно заранее прописать настройку — используемую JDK. Если не можете понять как это сделать, гуглите.

NetBeans

Перед началом работы, нужно подключить SceneBuilder: Сервис - Параметры - Java - JavaFX - Начальная страница Scene Builder. Выберите каталог программы. Настройку достаточно сделать один раз. Это относится ко всем IDE.

Подключение SceneBuilder в NetBeans

Новое приложение JavaFX в NetBeans

Настройки проекта JavaFX в NetBeans

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

Начальная программа JavaFX в NetBeans

Это круто, потому что мы не написали ни строчки кода, но уже получили программу с работающей кнопкой. :-)

Открытие fxml-файла в SceneBuilder

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

Стоит отметить, что после редактирования файла, закрывать SceneBuilder не нужно. Достаточно только сохраниться (Ctrl+S) и переключиться на IDE — она сама подхватит изменения.

Окно SceneBuilder разделено на три части:

  • слева — наборы компонентов, иерархия и Controller, где указывается основной класс (это важно!)
  • в центре — сама форма, где и происходит визуальное построение.
  • справа — свойства компонентов, разделенные на три закладки (это условное деление). Вкладка Code отвечает за то, что будет использоваться в java-файле.

Окно SceneBuilder

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

По условиям ТЗ у нас должно быть текстовое поле. NetBeans использует Label, но мы не будем ничего удалять, а просто добавим новый элемент TextField на форму (произвольно на ваш вкус).

Новое поле TextField в SceneBuilder

Теперь важный момент: для того чтобы можно было использовать компонент в java-программе (в нашем коде), следует выполнить две вещи.

Первая — проверить, что указан верный контролёр. В нашем случае NetBeans сам уже всё сделал и указал myfx.FXMLDocumentController .

Контролёр в SceneBuilder

Как видно — это контролёр из файла FXMLDocumentController.java (пакет.контролёр). Не всегда IDE его указывают, но это важно, поскольку fxml-файл (точнее java-код) использует его для привязки.

Второй момент — используемый компонент должен иметь свой ID — это параметр fx:id . Здесь я указал textField1.

Уникальный ID компонента

У кнопки, которая будет заполнять текстовое поле, тоже должен быть свой id, а также метод события onAction (это основное событие компонента, а не onClick, как в Delphi). NetBeans уже об этом позаботился, поэтому нам ничего не придется писать.

Задание метода события onAction

На этом визуальное построение можно завершить. Сохраняемся и переключаемся в NetBeans. Видим, что файл FXMLDocument.fxml изменился: добавился textField1:

Файл FXMLDocument.fxml в NetBeans

Установить контролер в NetBeans

После выполнения этой команды, произойдет переход к файлу FXMLDocumentController.java, где в код будет добавлено объявление переменной textField1:

Новая переменная в NetBeans

Запускаем программу на выполнение для теста. Теперь наша задача по клику на кнопке заполнить текстовое поле. Как вы уже поняли метод handleButtonAction как раз и выполняет нужную работу. В нём дописываем:

Обратите внимание как работает автодополнение кода после того, как будет нажата точка.

Автодополнение в NetBeans

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

Запускаем программу и видим, что всё работает как нужно.

Готовая программа в NetBeans

Нам пришлось написать всего одну строчку кода, ну и выполнить несколько дополнительных действий в редакторе.

Eclipse

Запуск Eclipse происходит несколько дольше, чем NetBeans. Вначале нужно указать путь к SceneBuilder. Делается это в Window - Preferences - JavaFX.

Настройка SceneBuilder в Eclipse

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

Создаём новый проект и выбираем JavaFX.

Новый проект JavaFX в Eclipse

Жмем Next и попадаем на страницу настроек. Здесь я указал название проекта, как и прежде myfx (у меня для разных IDE разные каталоги проектов, поэтому они не пересекаются друг с другом).

Начальные настройки проекта JavaFX в Eclipse

Дальше ещё несколько раз жмем на Next, пока не попадем на последние настройки.

Настройка проекта JavaFX в Eclipse

Здесь нужно выбрать тип приложения, тип контейнера и имя контролера. Жмем Finish и Eclipse быстро генерирует каркас нашей будущей программы.

Здесь всё очень похоже, только добавлен еще один файл application.css — да, да, в JavaFX можно использовать CSS для настройки оформления! Eclipse сразу сгенерировал для этого файла код подключения.

Запустим программу и убедимся, что нет ошибок.

Начальный вид программы JavaFX в Eclipse

В отличие от NetBeans, здесь совершенно пустая форма. Откроем её в SceneBuilder с помощью контекстного меню.

Открытие программы из Eclipse в SceneBuilder

Форма в SceneBuilder

Контейнер BorderPane состоит из 4-х частей: top, right, bottom, left и center. Компоненты следует помещать в разные части — от этого будет зависеть их положение при изменении размера окна.

Контейнер BorderPane

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

Я не стал особо мудрить и разместил вверху текстовое поле, а в центре кнопку.

Готовая форма в SceneBuilder

Теперь проверим, что указан контролёр: в данном случае application.SampleController — Eclipse выполнил эту работу за нас.

Предупреждения в SceneBuilder

Для кнопки укажем метод на событие — btn1Click.

Указание метода на событие в SceneBuilder

Сохранимся и вернёмся в Eclipse. Мы увидим, что файл Sample.fxml обновился, но рядом с некоторыми строками появились значки предупреждения.

Значки предупреждения в Eclipse

Quick Fix в Eclipse

При этом выскакивает подсказка о предполагаемом действии. Например для textField1 предлагается добавить идентификатор в контролёр:

Подсказки для textField1

а для кнопки ещё и метод-обработчик события:

Подсказки для btn1

При этом, Eclipse немного притормаживает и изменения не сразу отображаются на экране. Тут нужно либо переключиться на файл контролёра, либо немного подождать. В результате в код будет добавлены нужные изменения и значки предупреждений исчезнут.

Резльтат изменений в Eclipse

Добавим наш код как и раньше мы сделали в NetBeans.

Добавим наш код

Обратите внимание на более интелектуальную работу автодополнения. В автоматическом режиме он немного подтормаживает, но если нажать Ctrl+Пробел (эта же комбинация используется во многих IDE), то позволяет получить и неплохой хелп.

Автодополнение в Eclipse

Запускаем нашу программу.

Готовая программа в Eclipse

И записываем себе на счёт ещё одну IDE. :-)

IntelliJ IDEA

IntelliJ IDEA запускается довольно неспешно, можно успеть проверить почту. :-)

Опять же указываем путь к SceneBuilder: File - Settings:

Подключение SceneBuilder в IntelliJ IDEA

Дальше создаем новый проект:

Новый проект JavaFX в IntelliJ IDEA

И указываем его имя (как обычно — myfx):

Настройки нового проекта JavaFX в IntelliJ IDEA

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

Начальная программа JavaFX в IntelliJ IDEA

Здесь также пустая форма, но зато указан заголовок программы. Если посмотреть на код Main.java, то увидим строчку:

Переключаемся в SceneBuilder (аналогично Eclipse): второй кнопкой мыши нужно выбрать Open in SceneBuilder.

Здесь также пустая форма, но с контейнером GridPane. Устанавливаем Pref Width и Pref Height, чтобы отобразилась форма.

Сам по себе GridPane представляет собой аля-сетку из ячеек для элементов. Думаю, что тут нет смысла повторяться — все действия будут аналогичными:

  • разместить кнопку и тестовое поле,
  • присвоить им id,
  • для кнопки прописать метод для обработки клика,
  • не забываем проверить, указан ли контролёр (sample.Controller).

Форма в SceneBuilder

Закрываем SceneBuilder и возвращаемся в IntelliJ IDEA. Здесь нужно добавить идентификаторы id в код, а также создать метод для реакции на нажатие кнопки.

Всплывающая подсказка в IntelliJ IDEA

Второй — горячая клавиша Alt+Enter

Подсказка по горячей клавише в IntelliJ IDEA

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

Интеллектуальное автодополнение в IntelliJ IDEA

Вообще IntelliJ IDEA показывает достаточно хорошую сообразительность и выступает помощником в написании кода. Причём делает это самостоятельно без лишних нажатий кнопок.

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

Готовая программа JavaFX в IntelliJ IDEA

Прекрасно, всё работает!

Итого

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

Три IDE я привел не случайно. В Сети очень много примеров для Явы и все они для разных программ. Лично я ещё не определился со своим предпочтением, поскольку у всех есть как плюсы, так и минусы. Наверное нужно поработать со всеми, тогда и будет понятно.

Но, ключевой момент — это умение работать с SceneBuilder. Построение формы в JavaFX немного отличается от той же Delphi, в первую очередь в использовании сложных контейнеров (они могут быть вложенными друг в друга). Поэтому вначале следует разобраться с ними, после уже можно браться за сами компоненты.

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

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

Итак, в первую очередь вам понадобится установить JDK (Java Development Kit) — комплект средств разработки приложений на Java. Это софт от Oracle, включающий в себя: — среду выполнения (Java Runtime Environment); — компилятор (javac); — стандартную библиотеку Java; — примеры, техническую документацию.

Устанавливаем JDK

Установка IDE

Установив JDK, не помешает установить и IDE (Integrated Development Environment) – комплекс программных средств, применяемых разработчиками для создания программного обеспечения. Среда разработки IDE позволит вам легко писать, запускать, тестировать и отлаживать Java-код.

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

NetBeans

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

Eclipse

Среда предоставляет впечатляющий интерфейс, который удобен и интуитивно понятен. Скачивается бесплатно, имеет ряд плюсов: — форматирование кода; — поддержка разбиения кода на модули; — перетаскивание (drag-and-drop); — просмотр содержимого библиотек; — простота применения одного и того же кода в различных проектах.

IntelliJ IDEA

Известнейшая IDE для Java, написана на Java. Комплектуется уникальными инструментами, позволяет находить ошибки, упрощает отладку кода и т. д. Многие начинающие программисты используют этот софт для создания своих первых программ на Java.

JCreator

Достаточно продвинутая IDE для Java, которая написана на C++ и считается самой быстрой.

Пишем первую программу на Java. Структура программ на Java

Итак, у вас установлено и настроено всё, что необходимо для работы с Java: JDK, JRE и IDE. Что дальше? Конечно же, надо написать первую программу, чтобы удостовериться, что всё в порядке, код работает, а вы готовы изучать язык. Кроме того, это позволит вам познакомиться с базовой структурой Java-кода (тут стоит учесть, что перед началом изучения Java будет нелишним ознакомиться и с основными принципами ООП (объектно-ориентированного программирования). Что касается структуры программ на Java, то её можно представить следующим образом:

javas1_1-20219-9a172c.jpg

Файл с исходным кодом включает несколько классов — это части программы на Java, имеющие определённые функции. Считается хорошей практикой разбивать программы на несколько файлов с кодом, причём каждый со своим назначением. Что касается классов, то в них содержатся методы — это, по сути, действия, которые могут выполнять объекты данного класса. Метод содержит команды, позволяющие получать необходимый результат.

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

У Вас уже должны быть установлены среда разработки приложений NetBeans и JDK (Java Development Kit).

Запустите NetBeans. В меню выберите File/NewProject/Java/ и введите pro1 в ответ на запрос имени проекта, а затем нажмите Finish. При этом будет создан файл Pro1.java с классом Pro1 и пустым методом main() в нем.

Добавим следующий код в этот метод:

Для запуска программы выберем в меню Run /Run Project. В нижней панели отобразится результат работы программы:


Построим изучение основ языка Java на аналогиях, сравнивая его с языком C++. В начале рассмотрим программы, подобные простейшим MFC приложениям.

Начнем с простого, создадим программу, которая показывает пустое окно.


Исходный код программы:

Последовательность выполнения (обозначена 1-4) практически та же, что и для простейшего оконного MFC приложения. При разработке Java приложения программист использует базовые классы, строит производные от них классы. Проект программы может содержать несколько классов. Один из классов проекта содержит функцию main, которая есть точкой входа в программу. Имя класса должно совпадать с именем файла, в котором класс описан.

Java – полностью объектно-ориентированный язык, даже в большей степени, чем C++. Функции и переменные, не привязанные к контексту какого-либо объекта, больше не присутствуют в системе. Примером есть функция main и объект приложения app, которые в Java приложении отнесены к создаваемому классу приложения. В MFC приложении отсутствует функция main (WinMain спрятана в MFC каркасе) и объект приложения создается как глобальная переменная.

Полностью исключена препроцессорная обработка. Операция включения в программу файлов-заголовков с описаниями классов (include) заменена на операцию import, которая читает подготовленные бинарные файлы с описанием классов. Для поддержки пользовательских интерфейсов язык Java содержит библиотеки AWT и Swing, позволяющие создавать и поддерживать окна, использовать элементы управления (кнопки, меню, полосы прокрутки и др.), применять инструменты для создания графических приложений.

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

Вначале создадим метку (countLabel) а также две командные кнопки (addCrow и removeCrow) и разместим компоненты в окне:

Добавление событий

Пришло время добавить немного интерактивности. Нам нужно сделать 3 вещи:

  1. Научить кнопку addCrow добавлять 1 к переменной voron.
  2. Научить кнопку removeCrow вычитать 1 из переменной voron.
  3. Научить кнопку countLabel обновлять свое значение в зависимости от содержимого переменной voron.

Исходный код программы приводится ниже.

В MFC приложениях события идентифицировались именем константы в таблице-макросе, отнесенной к классу. Такое описание не имело ничего общего с ООП.

В Java для определения события используются три действующих лица – объект-источник события, объект-слушатель события и объект-событие.

Мы создаем сначала кнопку (объект-источник). При вызове метода addActionListener создается объект класса ActionListener (слушатель). При вызове обработчика события (метод actionPerformed) создается объект класса ActionEvent (событие), в котором объединены параметры события.

Объекты – источники событий должны быть объектами класса, который имеет методы для регистрации слушателя addXXXListener и отключения слушателя removeXXXListener. Здесь под XXX подразумевается некоторое имя события. Например, ActionListener или AWTEventListener, и т.д.

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

Для создания картинки необходимо в класс окна добавить панель – элемент класса, производный от класса Jpanel. Объектами на панели могут быть подгружаемые картинки, либо рисунки, выполненные инструментами Java 2D API.


Исходный код программы приводится ниже.

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

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

Дополнительно к рассмотренной реализации класса Board ниже приводятся две альтернативные версии.

Board.java (2-я версия)

В этой версии используем библиотеку java.util.Timer вместо javax.Swing.Timer. При этом вместо интерфейса ActionListener для анимации используется объект класса ScheduleTask, производный от класса TimerTask. Таймер каждые 10 мс вызывает метод run () класса ScheduleTaskclass. Начальная задержка составляет 100 мс.

Board.java (3-я версия)

Анимация объектов с помощью потока (Thread) — самый точный способ анимации. Он реализуется через интерфейс Runnable. В предыдущих примерах мы выполнили задачу через определенные промежутки времени. В этом примере анимация будет проходить внутри потока.

Метод addNotify () вызывается после того, как панель была добавлена в JFrame компонент — add(new Board()). Этот метод часто используется для различных задач инициализации.

Метод run () вызывается только один раз — после создания объекта animator, при его запуске: animator.start(). Из этого метода в бесконечном цикле while вызываются методы cycle () и repaint (). Время выполнения этих методов может быть различным в каждом из while циклов. А мы хотим, чтобы анимация проходила на постоянной скорости. Поэтому вычисляем разницу timeDiff системного времени до и после запуска обоих методов. Эту разницу вычитаем из константы DELAY (50 мс), корректируя тем самым необходимую задержку (sleep) выполнения потока.

Ошибки, возникшие в программе во время её работы обрабатываются через исключения. Обработка исключений произведена в программе с помощью операторов try…catch.

Snake (Змея) – одна из старейших классических видеоигр. В этой игре голова змеи перемещается с помощью клавиш управления курсором, хвост следует за ней.

Цель состоит в том, чтобы съесть столько яблок, как это возможно. Первоначально тело змеи состоит из 2-х суставов. Каждый раз, когда змея ест яблоко, ее тело растет. Змея должна избегать стен и своего собственного тела, поскольку в этом случае игра заканчивается.

Контрольные задания

Ознакомиться с программой “Snake” и последовательно модифицировать ее:

  1. Автоматизировать работу программы, т.е. обеспечить движение змейки к яблоку, без вмешательства пользователя.
  2. Обеспечить передвижение яблока (жертвы) в точку (random — выбор).
  3. Обеспечить с помощью клавиш управления курсором передвижение яблока. При этом игра приобретает новый статус, где жертва (например, мышка) убегает от охотника.
  4. Обеспечить управление передвижением жертвы с помощью мышки.

Краткий обзор сетевых приложений

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

В приложениях используется клиент-серверная парадигма, которую примерно можно определить следующим образом:

  1. Одна из программ, называемая сервером, ожидает, пока программа-клиент подключится к ней.
  2. Клиент подключается.
  3. Сервер и клиент обмениваются информацией.
  4. Связь между клиентом и сервером закрывается.

Каждое из приложений демонстрирует решение определенной задачи:

– Приложение “A Date Server and Client” обеспечивает простую одностороннюю связь. Сервер отправляет данные только одному подключенному клиенту.

– Приложение “A capitalize server and client” демонстрирует двустороннюю связь сервера с множеством подключенных к нему клиентов.

– Игра для двух игроков “Крестики-нолики” показывает работу сервера, который должен следить за состоянием игры и информировать клиентов, чтобы каждый мог обновить свои данные в соответствии с изменениями у другого клиента. Т.е., сервер выступает в качестве посредника при общении 2-х клиентов между собой.

При запуске программы-клиента также появляется окно “Input”. После ввода в текстовое окно IP-адреса сервера (localhost) появляется окно “Message” с данными от сервера (текущая дата и время).

Исходный код программы-сервера (файл DateServer.java):

Программа-сервер постоянно находится в состоянии ожидания, она прослушивает (listen) сеть, ожидая запросов от клиентов. Программа содержит класс DateServer с единственным методом main. Причем, этот метод объявляется так, что он может выбросить исключение (throws IOException).

В программе создаются сокеты. Сокет представляет собой программную конструкцию (объект), которая определяет конечную точку соединения. Вначале создается объект класса ServerSocket, затем — в бесконечном цикле ожидания while (true) объект класса Socket. Главное отличие ServerSocket от Socket, что объект первого класса (listener) заставляет программу ждать подключений. При подключении метод listener.accept() создает объект socket.

Затем создается объект out класса PrintWriter для вывода текста в поток. В параметрах конструктора указывается направление потока socket.getOutputStream() (выходной поток сокета) и задается автоматический сброс буфера (параметр autoFlush = true). Метод out.println (“текст”) обеспечивает запись текста в поток.

В бесконечном цикле while (true) можно передавать данные множеству подключаемых клиентов, если закомментировать break. Однако, при этом не предусмотрено закрытие объекта listener, оно возможно лишь через диспетчер задач (вызывается клавишами ctrl-alt-delete).

Исходный код программы-клиента (файл DateClient.java):

Вначале запускается dialog box с предложением ввести IP address сервера, затем клиент присоединяется к серверу (создается сокет s) и тот передает ему дату и время, которые отображаются в диалоговом окне.

Для получения данных от сервера открывается входной поток s.getInputStream(). А далее цепочка читателей: InputStreamReader читает байты из потока и преобразует их в символы; BufferedReader объединяет символы в строку. Строка отображается в диалоговом окне.

При запуске программы-клиента появляются окно “Capitalize Client” и окно “Welcome to the Capitalization Program” с текстовым окном для ввода IP-адреса сервера. После ввода IP-адреса сервера в окне “Capitalize Client” клиенту предлагается ввести строку . После ввода текста и нажатия клавиши Enter сервер получает строку, преобразует маленькие буквы в большие и возвращает обновленную строку клиенту.

Сервер позволяет подключаться нескольким клиентам.


Исходный код программы-сервера и программы-клиента приводится ниже.

Программа-сервер (файл CapitalizeServer.java):

В классе Capitalizer (производном от Thread) с интерфейсом Runnable определены все методы, необходимые для создания потоков. В рамках класса необходимо определить метод run. Он получает управление при запуске потока методом start.

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

Программа-клиент (файл CapitalizeClient.java):

При запуске программы-клиента также появляется окно “Player X”, при повторном ее запуске – окно “ Player O”. Дальнейшее развитие и окончание игры видно из рисунка.

Исходный код программы-сервера и программы-клиента приводится ниже. Рисунки и размещается в директории, где находятся файлы классов проекта программы-клиента.

Программа-сервер (файл TicTacToeServer.java):

В функции main программы-сервера (файл TicTacToeServer.java) создается объект listener и запускается бесконечный цикл.

В начале цикла создается объект класса Game. В этом классе описаны данные и методы, которые позволяют следить за состоянием игры и информировать клиентов, чтобы каждый мог обновить свои данные в соответствии с изменениями у другого клиента. В классе Game также описан встроенный класс Player, производный от класса Thread.

Далее в цикле объект listener прослушивает и подключает 2-х игроков-клиентов. Каждый из игроков (player) передается на обслуживание побочных потоков, а в конструкторе создаются сокет, потоки ввода-вывода и клиентам передаются приветствие и метка (mark) – X или O. Метка служит для идентификации клиента.

Метод legalMove определен с ключевым словом synchronized. Такой метод запрещает нескольким потокам одновременный доступ к нему. Прежде, чем начать выполнять его, поток пытается заблокировать объект, у которого вызывается метод. При завершении исполнения (как успешном, так и в случае ошибок) производится операция unlock, чтобы освободить объект для других потоков.

Метод legalMove вызывается в потоке игрока, который пытается сделать ход и проверяет, или ход является правильным. То есть, игрок выполняющий ход, должен быть текущим игроком и квадрат, в котором он пытается сделать ход, не должен быть уже занятым. Если ход правильный, состояние игры обновляется (квадрат заполнен, следующий игрок становится текущим, и он уведомляется о своем ходе).

Программа-клиент (файл TicTacToeClient.java):

В функции main программы-клиента запускается бесконечный цикл. В нем создается объект client класса TicTacToeClient. При этом конструктор устанавливает связь с сервером, создает сокет, потоки ввода-вывода, панель с массивом квадратных ячеек board[i]. Объекту каждой ячейки добавляется событие mousePressed, при котором через поток вывода серверу передается номер выбранной ячейки.

Контрольные задания


  • На основе игрового приложения ”Snake” создайте клиент-серверное приложение для 2-х игроков, где первый управляет движением змейки, а второй – движением жертвы. Победителем считается первый игрок, если он настигает жертву за отведенное время игры (определяется таймером), в противном случае побеждает второй игрок.

Разработка программ на Java – не особо сложный процесс. В статье мы разработаем крутое приложение с отличным дизайном и функциями. Для программы мы воспользуемся JavaFx.

Установка всего

Также зайдите на сайт Oracle и скачайте Java . Рекомендуем скачать и установить Java 11, так как с Java 13 будут разного рода ошибки при работе с Javafx.

Создание проекта

Через любую среду разработки создайте новый JavaFx проект.



Создание дизайна


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


Создание функций

Остается прописать весь функционал. Ниже представлен полный код основного контроллера, но также по этой ссылке вы можете скачать готовый проект всей программы.

Код класса контроллера:

Видео на эту тему

Также вы можете просмотреть детальное видео по разработке данного приложения:


Дополнительный курс

На нашем сайте также есть углубленный курс по изучению языка Java . В ходе огромной программы вы изучите не только язык Java, но также научитесь создавать веб сайты, программы под ПК, приложения под Андроид и многое другое. За курс вы изучите массу нового и к концу программы будете уметь работать с языком Java и создавать на нём полноценные проекты.

Больше интересных новостей

Зачем нужен выделенный сервер? Где его взять?

Зачем нужен выделенный сервер? Где его взять?

10 самых провальных технологических запусков последнего десятилетия

10 самых провальных технологических запусков последнего десятилетия

Зарплаты айтишников в разных странах: где программисту жить хорошо?

Зарплаты айтишников в разных странах: где программисту жить хорошо?

Почему расширения Google Chrome никому не нужны?

Почему расширения Google Chrome никому не нужны?

Hello World Vertex Academy

Чтобы научиться программировать, необходимо как можно больше кодить. Перефразируя известного советского деятеля, главным лозунгом начинающего программиста должно быть "Кодить, кодить и еще раз кодить!". Поэтому мы начнем с написания нашей первой программы. Так уже исторически сложилось, первой программой, которую пишут на новом языке программирования, является вывод "Hello, World!" Этим мы и займемся.

Открываем среду разработки (Eclipse, IntelliJ IDEA или еще что-то, смотря что Вы установили у себя на компьютере) и делаем следующее:

Проект - это, упрощенно говоря, набор файлов и папок, которые относятся к Вашей задаче. В большинстве IDE (англ. Integrated development environment - интегрированная среда разработки; программа, в которой пишут другие программы) для создания проекта нужно нажать "Файл" - "Создать проект", а дальше настроить параметры проекта. Детальнее об этом можно прочитать в статье "Установка Eclipse"