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

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

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

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

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

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

Интересный момент – метод editorPanesetTextWithNoUndo. При открытии файла мы не хотим, чтобы вся операция загрузки текста попала в историю UndoManager как одно большое изменение. Поэтому слушатель временно отключается, текст загружается, а затем UndoManager очищается.
JForge [4] – это, конечно, не замена мощным современным IDE [5], но он демонстрирует, как с помощью стандартных средств Java Swing можно создать довольно функциональный инструмент для разработки. Проект стал отличной площадкой для изучения тонкостей UIManager, работы с JTextPane и StyledDocument, взаимодействия с системным компилятором и процессами.
Основные моменты, которые удалось реализовать:
Полностью кастомная темная тема.
Динамическая нумерация строк.
Базовая, но рабочая подсветка синтаксиса.
Интеграция компиляции и запуска Java-кода.
Надеюсь, этот обзор был интересен и, возможно, вдохновит кого-то на собственные эксперименты со Swing. Код проекта открыт, так что смело заглядывайте на GitHub [4], форкайте, экспериментируйте!
Еще раз ссылка на репозиторий: https://github.com/Jacqquard/JForge-v.0.1A [4]
Автор: jacqquard
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/419453
Ссылки в тексте:
[1] https://github.com/Jacqquard: https://github.com/Jacqquard
[2] IntelliJ IDEA: https://www.jetbrains.com/idea/
[3] Swing: https://ru.wikipedia.org/wiki/Swing_(%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0)
[4] JForge: https://github.com/Jacqquard/JForge-v.0.1A
[5] IDE: https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8
[6] Источник: https://habr.com/ru/articles/908534/?utm_source=habrahabr&utm_medium=rss&utm_campaign=908534
Нажмите здесь для печати.