Jacquard

Ссылка на GitHub: https://github.com/Jacqquard

Каждый из нас, 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)


  1. m_chrom
    12.05.2025 08:59

    Это круто, что вас не пугают такие грандиозные цели как собственная ИДЕ ))) пусть и для учебных экспериментов

    А можно вопрос почему вы выбрали именно Swing? В 2025 году Swing, мягко говоря, не самая свежая технология ))


    1. jacqquard Автор
      12.05.2025 08:59

      Хороший вопрос))
      Я просто поставил себе цель, написать на стандартах библиотеках и свинг прекрасно подошел под мои требование))


  1. kmatveev
    12.05.2025 08:59

    Очень неплохо!

    Хотел предложить распространять LookAndFeel отдельно, глянул в исходники, чтобы поглядеть, какие шрифты используются, и понял, что это покрашенный Metal. Ну тоже норм. А можно убрать установку цветов Foreground/Background/Caret/Selection для JTextArea в UIManager?

    Ещё посмотрел, как сделана подсветка синтаксиса, увидел regexp-ы. Имеет смысл вынести компиляцию Patter-нов куда-нибудь в конструктор или инициализацию, они же не меняются. И я не увидел паттерн для чисел, а на скриншотах они подсвечены, как это сделано?