Каждый из нас, Java-разработчиков, хоть раз задумывался: "А что, если взять и написать свою IDE?". Ну, может, не полноценную замену IntelliJ IDEA, но что-то компактное, для души, для изучения Swing или просто для фана. Сегодня я хочу поделиться именно таким проектом – JForge, простой IDE для Java, написанной полностью на Swing, с акцентом на приятный темный интерфейс и базовые, но необходимые фичи.
Этот проект начинался как эксперимент "а смогу ли?", но постепенно оброс функционалом, который делает его вполне юзабельным для небольших Java-проектов или быстрого прототипирования.
Ссылка на репозиторий: https://github.com/Jacqquard/JForge-v.0.1A
Что умеет JForge?
Темная тема: Приятный для глаз интерфейс, полностью кастомизированный через UIManager.
Редактор кода: На базе JTextPane с поддержкой отмены/повтора действий (UndoManager).
Нумерация строк: Кастомный компонент, отображающий номера строк слева от редактора.
Подсветка синтаксиса Java: Базовая подсветка для ключевых слов, комментариев (однострочных и многострочных) и строковых литералов.
Работа с файлами: Создание, открытие, сохранение, "Сохранить как...".
Компиляция и запуск: Встроенная возможность скомпилировать текущий .java файл и запустить его, с выводом в интегрированную консоль.
Консоль вывода: JTextArea для отображения сообщений компилятора и вывода запущенной программы.
Разделитель: JSplitPane для удобного изменения размеров областей редактора и консоли.
Архитектура и ключевые компоненты
1. Темная тема всему голова!
Первое, что бросается в глаза – это темный интерфейс. Для его реализации не использовались сторонние LookAndFeel библиотеки. Вместо этого, я пошел по пути настройки стандартных свойств UIManager. Это дает полный контроль над каждым элементом.

Этот подход требует терпения, так как приходится перебирать множество ключей UIManager, но результат того стоит – единый стиль во всем приложении. Особое внимание уделено таким деталям, как цвет каретки, выделения текста, фона меню и элементов управления.
2. Сердце IDE – редактор кода
Редактор кода реализован с помощью JTextPane. Это позволяет не только вводить текст, но и применять к нему различные стили, что критично для подсветки синтаксиса.

Для отмены/повтора действий используется стандартный UndoManager. Каждое изменение в документе редактора регистрируется, позволяя легко откатывать или накатывать правки через меню "Edit" или горячие клавиши (Ctrl+Z, Ctrl+Y).
3. Нумерация строк – как в больших IDE
Для отображения номеров строк рядом с редактором написан отдельный класс TextLineNumber. Этот компонент:
Размещается в RowHeader у JScrollPane, в который обернут editorPane.
Слушает изменения в документе редактора (DocumentListener), чтобы перерисовываться и обновлять ширину при добавлении/удалении строк.
Слушает изменения шрифта редактора (PropertyChangeListener), чтобы синхронизировать свой шрифт.
Динамически рассчитывает свою ширину в зависимости от максимального номера строки.
В методе paintComponent отрисовывает номера строк, выравнивая их по правому краю и синхронизируя с видимой областью редактора.

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

Метод applyHighlighting вызывается при каждом изменении текста в редакторе. Он сначала сбрасывает все стили к дефолтным, а затем последовательно применяет стили для комментариев, строк и ключевых слов. Порядок важен, чтобы, например, ключевые слова внутри комментариев не подсвечивались как ключевые слова. Конечно, это базовая реализация, и она не учитывает контекст (например, ключевое слово в строке не будет подсвечено как ключевое слово), но для простого редактора это уже неплохо.
5. Компиляция и запуск кода
Одна из ключевых функций IDE – возможность быстро проверить написанный код. JForge использует системный компилятор Java (ToolProvider.getSystemJavaCompiler()) для компиляции .java файлов.

Если компиляция проходит успешно, JForge запускает скомпилированный класс с помощью ProcessBuilder. Весь вывод (stdout и stderr) запущенного процесса перенаправляется в consoleArea IDE. Если файл не сохранен или не является .java файлом, JForge предложит сохранить его как TempClass.java и попытается скомпилировать. Важно, чтобы в этом случае публичный класс в редакторе также назывался TempClass.
6. Работа с файлами и пользовательский опыт
Стандартные операции с файлами (New, Open, Save, Save As) реализованы с помощью JFileChooser. При закрытии файла или выходе из приложения JForge проверяет, есть ли несохраненные изменения, и предлагает пользователю сохранить их.

Интересный момент – метод editorPanesetTextWithNoUndo. При открытии файла мы не хотим, чтобы вся операция загрузки текста попала в историю UndoManager как одно большое изменение. Поэтому слушатель временно отключается, текст загружается, а затем UndoManager очищается.
Заключение
JForge – это, конечно, не замена мощным современным IDE, но он демонстрирует, как с помощью стандартных средств Java Swing можно создать довольно функциональный инструмент для разработки. Проект стал отличной площадкой для изучения тонкостей UIManager, работы с JTextPane и StyledDocument, взаимодействия с системным компилятором и процессами.
Основные моменты, которые удалось реализовать:
Полностью кастомная темная тема.
Динамическая нумерация строк.
Базовая, но рабочая подсветка синтаксиса.
Интеграция компиляции и запуска Java-кода.
Надеюсь, этот обзор был интересен и, возможно, вдохновит кого-то на собственные эксперименты со Swing. Код проекта открыт, так что смело заглядывайте на GitHub, форкайте, экспериментируйте!
Еще раз ссылка на репозиторий: https://github.com/Jacqquard/JForge-v.0.1A
Комментарии (3)
kmatveev
12.05.2025 08:59Очень неплохо!
Хотел предложить распространять LookAndFeel отдельно, глянул в исходники, чтобы поглядеть, какие шрифты используются, и понял, что это покрашенный Metal. Ну тоже норм. А можно убрать установку цветов Foreground/Background/Caret/Selection для JTextArea в UIManager?
Ещё посмотрел, как сделана подсветка синтаксиса, увидел regexp-ы. Имеет смысл вынести компиляцию Patter-нов куда-нибудь в конструктор или инициализацию, они же не меняются. И я не увидел паттерн для чисел, а на скриншотах они подсвечены, как это сделано?
m_chrom
Это круто, что вас не пугают такие грандиозные цели как собственная ИДЕ ))) пусть и для учебных экспериментов
А можно вопрос почему вы выбрали именно Swing? В 2025 году Swing, мягко говоря, не самая свежая технология ))
jacqquard Автор
Хороший вопрос))
Я просто поставил себе цель, написать на стандартах библиотеках и свинг прекрасно подошел под мои требование))