Содержание
  1. Какие бывают приложения на Java
  2. Что такое оконное приложение на Java
  3. Как создать оконное приложение на Java: шаг 1 — поставить JDK
  4. Шаг 2 — первое окно: минимальный код приложения Java
  5. Шаг 3 — компиляция и запуск приложения Java
  6. Шаг 4 — окно с кнопкой, полем и обработчиком событий
  7. Когда подключать IDE и что ломается чаще всего
  8. Swing или JavaFX: чем делать оконные приложения в 2026 году
  9. Как превратить приложение Java в исполняемый файл
  10. Android и серверные приложения на Java: что меняется
  11. Частые вопросы про приложения Java
ГайдыОбновлено · 08.2026

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

14 августа 2023 · 16 минут чтения

Приложение на 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. Если статья или курс предлагает вам начать с апплета, материал устарел минимум на пять лет.

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

Что такое оконное приложение на 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-приложения на странице сайта неработоспособны.

Читайте также

3 материала