Приложение на 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 скрывает четыре разных набора инструментов. Выбор типа определяет, что вы устанавливаете и чем запускаете — язык при этом один и тот же.
| Тип приложения | Чем делают интерфейс | Что ставить сверх 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 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
Что такое оконное приложение на 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 или пропишите путь вручную. Проверять что-то ещё до того, как эта команда отработала, бессмысленно.

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

Создайте файл 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».

Разбирать чужой код и чинить ошибки быстрее с ИИ-помощником прямо в редакторе — как это устроено на практике, показано в разборе как использовать 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 и узнай, как пользоваться функционалом остальных ИИ в одном
- УЧАСТВОВАТЬ ЗА 0 РУБ.
- Расскажем, как получить подписку
- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ