Приложение на Java — это программа, скомпилированная в байт-код и запускаемая виртуальной машиной JVM. Такие программы делятся на четыре рабочих типа: оконные (десктопные), Android-приложения, серверные и консольные. Ниже — код оконного приложения, который компилируется на Java 25 LTS без единого предупреждения, и разбор того, чем остальные типы отличаются по инструментам.

Что нужно знать до первой строки кода (проверено в августе 2026 года):

  • Действующая LTS-версия — Java 25, она вышла 16 сентября 2025 года. Последний выпуск на сегодня — Java 26 от 17 марта 2026-го, но он не LTS.
  • Для оконного приложения ничего доустанавливать не нужно: библиотека Swing лежит внутри JDK. JavaFX в JDK не входит и ставится отдельным SDK.
  • Апплетов больше нет: в JDK 26 пакет java.applet и класс javax.swing.JApplet удалены. Инструкции про «java-приложение в браузере» не воспроизводятся ни на одной актуальной версии.
  • IDE для первого окна необязательна. С Java 11 файл запускается одной командой: java MainApp.java.
  • Готовое окно превращается в самостоятельный .exe штатной утилитой jpackage — тоже из JDK, без сторонних упаковщиков.

Дальше по шагам: типы приложений и что для каждого нужно, минимальное окно, окно с кнопкой и обработчиком событий, сборка в исполняемый файл. Если Java у вас первый язык, сначала стоит свериться с обзором как выбрать первый язык программирования — Java хорошо подходит для десктопа и Android, но не для быстрых скриптов.

Какие бывают приложения на Java

Развилка: какое приложение на Java вы делаете и что для него нужно
Развилка: какое приложение на Java вы делаете и что для него нужно

Слово «приложение» в Java скрывает четыре разных набора инструментов. Выбор типа определяет, что вы устанавливаете и чем запускаете — язык при этом один и тот же.

Тип приложения Чем делают интерфейс Что ставить сверх JDK Чем запускают
Оконное (десктоп) Swing или JavaFX Для Swing — ничего, он внутри JDK. Для JavaFX — отдельный SDK java на компьютере пользователя или собранный .exe
Android Штатный UI-тулкит Android, Swing и JavaFX там не работают Android SDK и Android Studio Среда выполнения Android на устройстве
Серверное Интерфейса нет, наружу торчит HTTP-API Сборщик (Maven или Gradle) и фреймворк JVM на сервере или в контейнере
Консольное Текстовый ввод-вывод Ничего java в терминале

Пятый тип — апплеты, java-программы внутри страницы браузера — в 2026 году больше не существует. В JDK 26 удалён весь пакет java.applet и класс javax.swing.JApplet. В спецификации изменения сказано прямо: API устарел, «потому что ни свежие выпуски JDK, ни современные браузеры апплеты не поддерживают», а инструмент appletviewer убрали ещё в JDK 11. Если статья или курс предлагает вам начать с апплета, материал устарел минимум на пять лет.

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

ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК нейросети DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
  • Где и как применять? Потестируем модель после установки на разных задачах
  • Как дообучить модель под себя?

Что такое оконное приложение на Java

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

Почему такие программы до сих пор пишут, хотя есть веб:

  • Порог входа для пользователя. Интерфейс объясняет сам себя, инструкции к нему почти не нужны.
  • Работа без сети и без браузера. Приложение открывает локальные файлы, печатает, обращается к оборудованию.
  • Реакция на события. Нажатие, ввод, перетаскивание файла обрабатываются в реальном времени.
  • Одна кодовая база на три системы. Тот же код запускается на Windows, macOS и Linux, пока там есть JVM.
  • Масштаб по потребности. От калькулятора на одном классе до бухгалтерской программы с базой данных.

Оконными приложениями остаются офисные пакеты, графические редакторы, клиенты баз данных вроде MySQL Workbench, медиаплееры и сами среды разработки: IntelliJ IDEA и Eclipse — это тоже оконные приложения, написанные на Java.

Ключевое отличие от консоли — не внешний вид, а модель работы. Консольная программа выполняется сверху вниз и завершается. Оконная после запуска отдаёт управление циклу событий: она ждёт действий пользователя и просыпается на каждом из них. Из этого вытекает главное техническое требование, которое ломает половину первых приложений, — про поток обработки событий. О нём в разделе с кодом.

Как создать оконное приложение на Java: шаг 1 — поставить JDK

Нужен именно JDK (Java Development Kit), а не JRE: в JDK лежат компилятор javac, средство запуска java и упаковщик jpackage. Свежая LTS-версия — Java 25, вышла 16 сентября 2025 года и будет долгосрочной у большинства поставщиков. Брать её можно у Oracle либо в виде открытой сборки Eclipse Temurin — набор инструментов одинаковый.

Проверка, что установка удалась, — одна команда в терминале:

java -version

На нашем стенде (Windows 11 x64, Temurin 25.0.4) она печатает:

openjdk version "25.0.4" 2026-07-21 LTS OpenJDK Runtime Environment Temurin-25.0.4+7 (build 25.0.4+7-LTS) OpenJDK 64-Bit Server VM Temurin-25.0.4+7 (build 25.0.4+7-LTS, mixed mode, sharing)

Если вместо этого терминал отвечает «команда не найдена», JDK не прописан в переменной PATH — переустановите с галочкой добавления в PATH или пропишите путь вручную. Проверять что-то ещё до того, как эта команда отработала, бессмысленно.

Страница загрузки Java Development Kit

Шаг 2 — первое окно: минимальный код приложения Java

Порядок вызовов при создании окна Swing: пропуск любого шага даёт свой характерный сбой
Порядок вызовов при создании окна Swing: пропуск любого шага даёт свой характерный сбой

Создайте файл MainApp.java в любой папке. Обычным блокнотом, редактором кода — чем угодно, IDE на этом шаге не нужна.

import javax.swing.JFrame; import javax.swing.SwingUtilities; public class MainApp { public static void main(String[] args) { SwingUtilities.invokeLater(() -> { JFrame frame = new JFrame("Моё первое оконное приложение"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); }); } }

Имя файла обязано совпадать с именем открытого класса: класс MainApp — файл MainApp.java. Это правило языка, а не привычка.

Что делает каждая строка

  • SwingUtilities.invokeLater(...) — переносит создание окна в поток обработки событий. Официальный туториал Swing формулирует это как требование: «почти весь код, который создаёт компоненты Swing или взаимодействует с ними, обязан выполняться в потоке диспетчеризации событий» (docs.oracle.com, Concurrency in Swing). Без обёртки код чаще всего тоже «работает» — до первого зависшего или наполовину отрисованного окна.
  • new JFrame("...") — само окно с заголовком.
  • setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) — закрытие окна завершает программу. Пропустите строку — окно исчезнет, а процесс java останется висеть в диспетчере задач. Это самая частая жалоба «программа не закрывается».
  • setSize(400, 300) — размер в пикселях, setLocationRelativeTo(null) — окно по центру экрана.
  • setVisible(true) — показать. До этой строки окна на экране нет.

Шаг 3 — компиляция и запуск приложения Java

Из папки с файлом выполните две команды:

javac MainApp.java java MainApp

Первая создаёт рядом файл MainApp.class с байт-кодом, вторая его запускает. Обратите внимание: во второй команде расширения нет — java MainApp, а не java MainApp.class. На этом спотыкаются почти все новички.

С Java 11 доступен короткий путь — запуск прямо из исходника, без отдельной компиляции:

java MainApp.java

Возможность добавлена спецификацией JEP 330 «Launch Single-File Source-Code Programs» и работает для программ из одного файла. Для первых экспериментов это экономит половину действий.

Мы прогнали оба примера из статьи на Temurin JDK 25.0.4 с включёнными предупреждениями компилятора: javac -Xlint:all вернул код 0 и ноль строк диагностики — ни ошибок, ни предупреждений. Запуск даёт пустой вывод в консоли и открытое окно: процесс не завершается сам, потому что цикл событий продолжает работать. Пустая консоль здесь — признак исправной программы, а не отсутствия результата.

Шаг 4 — окно с кнопкой, полем и обработчиком событий

Пустое окно — половина дела. Приложением оно становится, когда реагирует на действия. Добавим поле ввода, кнопку и надпись, которая меняется по нажатию. Файл GreetApp.java:

import java.awt.BorderLayout; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class GreetApp { public static void main(String[] args) { SwingUtilities.invokeLater(GreetApp::createAndShowGui); } private static void createAndShowGui() { JFrame frame = new JFrame("Приветствие"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField nameField = new JTextField(15); JButton greetButton = new JButton("Поздороваться"); JLabel resultLabel = new JLabel("Введите имя и нажмите кнопку"); greetButton.addActionListener(event -> { String name = nameField.getText().trim(); if (name.isEmpty()) { resultLabel.setText("Поле пустое: введите имя"); } else { resultLabel.setText("Привет, " + name + "!"); } }); JPanel topPanel = new JPanel(new FlowLayout()); topPanel.add(new JLabel("Имя:")); topPanel.add(nameField); topPanel.add(greetButton); frame.add(topPanel, BorderLayout.NORTH); frame.add(resultLabel, BorderLayout.CENTER); frame.pack(); frame.setSize(420, 160); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

Запуск — те же две команды: javac GreetApp.java, затем java GreetApp. Компилируется без предупреждений на том же стенде.

Что здесь важного, кроме самих компонентов:

  • addActionListener принимает лямбду — тело срабатывает при нажатии. Отдельный класс-слушатель, как в старых учебниках, писать не нужно уже много лет.
  • Пустой ввод обрабатывается явно. Приложение без проверки ввода — источник самых глупых багов: пользователь нажимает кнопку до того, как что-то напечатал.
  • JPanel с FlowLayout собирает три элемента в строку, а окно раскладывает панель и надпись по областям BorderLayout. Менеджеры компоновки избавляют от ручных координат: при изменении размера окна элементы перестраиваются сами.
  • pack() подгоняет окно под содержимое; следующая строка задаёт удобный минимум, чтобы длинное имя не обрезало надпись.

Когда подключать IDE и что ломается чаще всего

Среда разработки не нужна для первого окна, но становится обязательной, как только классов больше двух: она подсвечивает ошибки до компиляции, подставляет импорты и запускает программу одной кнопкой. Из бесплатных вариантов чаще берут Eclipse IDE и IntelliJ IDEA Community. Порядок один: создать Java-проект, внутри создать класс, вставить код, запустить командой «Run as → Java Application».

Страница загрузки Eclipse IDE для Java

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

Ошибки первых запусков почти всегда из короткого списка:

Что видно Причина Что сделать
Could not find or load main class Запускают с расширением или не из той папки Команда java MainApp без .class, из папки с классом
class MainApp is public, should be declared in a file named MainApp.java Имя файла не совпало с именем класса Переименовать файл
Окно закрыли, процесс java висит Нет setDefaultCloseOperation Добавить JFrame.EXIT_ON_CLOSE
Окно не появилось, ошибок нет Забыли setVisible(true) Добавить строку последней
error: unmappable character for encoding UTF-8 Русский текст в исходнике, а файл сохранён в кодировке Windows-1251 Пересохранить файл в UTF-8: начиная с Java 18 компилятор ждёт именно её

Отдельно про «программа не реагирует»: если внутри обработчика кнопки запустить долгую операцию — чтение большого файла, запрос в сеть, — окно замрёт до её конца. Причина та же, что и с invokeLater: обработчики выполняются в том же потоке, что и отрисовка. Длинную работу выносят в SwingWorker.

Swing или JavaFX: чем делать оконные приложения в 2026 году

Это единственная развилка, которая реально стоит перед desktop-разработчиком на Java. Swing лежит в JDK и работает сразу. JavaFX — отдельный проект OpenJFX: «среда выполнения доступна как SDK под конкретную платформу, как набор jmod-модулей и как артефакты в Maven Central» (openjfx.io). То есть его надо скачать и подключить руками либо через сборщик.

Критерий Swing JavaFX
Установка Уже в JDK Отдельный SDK или зависимость в Maven/Gradle
Запуск примера из статьи java GreetApp java --module-path <fx>/lib --add-modules javafx.controls HelloFX
Оформление Look and Feel, темы подключаются библиотеками Стили на CSS, разметка в FXML
Инструмент верстки мышью Плагины IDE Scene Builder
Порог входа Ниже: ноль настройки Выше: сначала настраиваете сборку

Считать Swing мёртвым — распространённая ошибка. В мае 2026 года Фил Рейс написал в Inside.java, блоге команды Java в Oracle: «Инструментарий Swing, работающий на Java2D и тесно связанный с AWT, остаётся основной частью JDK. Он далеко не наследие: клиентские библиотеки JDK продолжают развиваться». Там же сказано, что Swing и JavaFX работают рядом, а не вместо друг друга.

Практический вывод простой. Первое окно и внутренние утилиты — Swing: меньше движений, тот же результат. Продукт с дизайном, анимацией и темами — JavaFX: CSS и FXML дают отделить внешний вид от логики.

Тот же пример на JavaFX

import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class HelloFX extends Application { @Override public void start(Stage stage) { TextField nameField = new TextField(); Button greetButton = new Button("Поздороваться"); Label resultLabel = new Label("Введите имя и нажмите кнопку"); greetButton.setOnAction(event -> { String name = nameField.getText().trim(); resultLabel.setText(name.isEmpty() ? "Поле пустое: введите имя" : "Привет, " + name + "!"); }); VBox root = new VBox(10, nameField, greetButton, resultLabel); root.setPadding(new Insets(15)); stage.setTitle("Приветствие на JavaFX"); stage.setScene(new Scene(root, 420, 160)); stage.show(); } public static void main(String[] args) { launch(args); } }

Компиляция и запуск требуют пути к библиотекам SDK. Мы проверяли на JavaFX 25.0.4 рядом с Temurin JDK 25.0.4:

javac --module-path C:\javafx-sdk-25.0.4\lib --add-modules javafx.controls HelloFX.java java --module-path C:\javafx-sdk-25.0.4\lib --add-modules javafx.controls HelloFX

Компилятор отработал молча, окно открылось — но при запуске в консоль упали четыре строки WARNING про ограниченный доступ к нативному коду, первая из них: WARNING: A restricted method in java.lang.System has been called. Это не поломка: JDK предупреждает о вызове ограниченного метода и в третьей строке сам называет нужный ключ. Добавляем его — и вывод становится пустым:

java --module-path C:\javafx-sdk-25.0.4\lib --add-modules javafx.controls --enable-native-access=javafx.graphics HelloFX

Запомните этот приём: JDK почти всегда сам называет ключ, который снимет его же предупреждение. Читать третью строку вывода полезнее, чем искать текст ошибки в поиске.

Как превратить приложение Java в исполняемый файл

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

Раздавать пользователям .class-файлы и просить их поставить Java — так сегодня не делают. В JDK есть штатный упаковщик jpackage: «инструмент для упаковки самодостаточных приложений Java», он берёт программу и образ среды выполнения и делает пакет в формате системы — exe на Windows, dmg на macOS. Кросс-платформенной сборки нет: exe собирается только на Windows.

Три команды от исходника до готовой папки с программой:

javac -d out MainApp.java mkdir input jar --create --file input/app.jar --main-class MainApp -C out . jpackage --type app-image --name MyFirstApp --input input --main-jar app.jar --dest dist

На нашем стенде это дало папку dist/MyFirstApp с файлом MyFirstApp.exe и вложенной средой выполнения. Итоговый вес — 122,6 МБ. Такова цена самодостаточности: внутрь кладётся урезанная JVM, зато на машине пользователя ничего ставить не нужно. Мы запустили exe и получили то же окно.

Значение --type меняет результат: app-image — папка с программой, exe и msi — установщики Windows, dmg и pkg — macOS, deb и rpm — Linux.

Android и серверные приложения на Java: что меняется

Код, который вы написали выше, на телефоне не запустится, и дело не в языке. Android-приложение собирается своим набором инструментов: Android SDK, Android Studio, собственная среда выполнения на устройстве. Классы JFrame и Stage там отсутствуют — интерфейс описывают штатным тулкитом Android. Знание Java переносится полностью, привычки по интерфейсу — нет.

Серверное приложение — обратный случай: интерфейса нет вообще, наружу торчит HTTP-API, а запускается всё на JVM в контейнере. Отсюда и разница в сроке жизни: оконную программу пользователь обновляет сам, серверную обновляют на сервере, и она может работать годами без единой установки на чужих машинах.

Порядок освоения, который экономит время: сначала оконное приложение — оно даёт видимый результат за один вечер; затем работа с файлами и базой данных через JDBC; после этого сборщик Maven или Gradle, без которого не собирается ни один серверный проект. Android имеет смысл брать после того, как понятны классы, коллекции и обработка событий.

Отдельно про скорость обучения: разбор незнакомого кода и починка ошибок сегодня ускоряются ИИ-инструментами — практический разбор есть в материале о том, как разработчик с 20-летним опытом ускорил работу с помощью ИИ. Осторожность одна: сгенерированный код всё равно проверяйте компилятором, а не на глаз.

Что улучшить в вашем окне дальше

  • Добавить меню через JMenuBar и пункты JMenuItem.
  • Показывать всплывающие сообщения через JOptionPane вместо надписи.
  • Перенести длинные операции в SwingWorker, чтобы окно не замирало.
  • Сменить оформление через Look and Feel.
  • Сохранять введённые данные в файл или в базу через JDBC.

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

Частые вопросы про приложения Java

Что такое приложение на Java?

Это программа, исходный код которой компилируется в байт-код и выполняется виртуальной машиной JVM. По способу запуска приложения на Java делятся на оконные (десктопные), Android-приложения, серверные и консольные. Язык и компилятор у них общие, различаются набор библиотек и способ запуска.

Какая версия Java нужна в 2026 году?

Java 25 — действующая LTS-версия, она вышла 16 сентября 2025 года и поддерживается долгосрочно у большинства поставщиков. Последний выпуск, Java 26, вышел 17 марта 2026 года, но это не LTS. Для учебных и рабочих проектов берите Java 25.

Как сделать приложение в окне на Java?

Нужен JDK и один файл с классом. Создайте объект JFrame, задайте ему размер и поведение при закрытии, вызовите setVisible(true), а всё создание окна оберните в SwingUtilities.invokeLater. Компиляция и запуск занимают две команды: javac MainApp.java и java MainApp.

Что выбрать новичку — Swing или JavaFX?

Swing, если цель — быстро получить работающее окно: он уже входит в JDK и не требует настройки. JavaFX ставится отдельным SDK и запускается с ключами —module-path и —add-modules, зато даёт стили на CSS, разметку в FXML и визуальный редактор Scene Builder. Обе библиотеки актуальны и используются рядом.

Можно ли собрать приложение Java в файл .exe?

Да, штатной утилитой jpackage из состава JDK: она упаковывает программу вместе с урезанной средой выполнения, поэтому на компьютере пользователя Java ставить не нужно. Сборка возможна только на той же системе, для которой делается пакет: exe собирается на Windows, dmg на macOS. Наш пример весит 122,6 МБ.

Работают ли java-приложения в браузере?

Нет. Апплеты удалены: в JDK 26 из платформы убраны пакет java.applet и класс javax.swing.JApplet, а инструмент appletviewer убрали ещё в JDK 11. Современные браузеры апплеты не поддерживают, поэтому инструкции про запуск java-приложения на странице сайта неработоспособны.

Большой практикум
ЗАМЕНИ ВСЕ НЕЙРОСЕТИ НА ОДНУ — PERPLEXITY
ПОКАЖЕМ НА КОНКРЕТНЫХ КЕЙСАХ
  • Освой нейросеть Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
  • УЧАСТВОВАТЬ ЗА 0 РУБ.
  • Расскажем, как получить подписку
Участвовать бесплатно
ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК нейросети DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
Участвовать бесплатно