В простейшем случае создается простая рамка толщиной в один пиксель, в которую слева сверху вставлена строка.
Однако надпись можно вставить в рамку любого типа.
Первым аргументом служит рамка, в которую нужно вставить надпись, второй аргумент – это надпись, третий аргумент – это выравнивание надписи по горизонтали, четвертый аргумент – это расположение надписи на рамке, пятый аргумент – это шрифт, и шестой аргумент – это цвет надписи.
Класс CompoundBorder создает рамку, состоящую из двух вложенных рамок любых типов.
Первым аргументов указывается внешняя рамка, а вторым аргументом указывается внутренняя рамка.
Рамка DashedBorder представляет собой пунктирную линию.
Первым аргументом указывается цвет рамки, второй аргумент – это длина пунктира, третий аргумент – это расстояние между пунктирами.
Свою рамку можно создать, расширив какой-либо класс рамок или расширив абстрактный класс AbstractBorder.
Look and Feel
Как уже было сказано, вид и контроллер, в архитектуре MVC библиотеки Swing, объединены вместе в один элемент – представителя пользовательского интерфейса (delegate UI).
Класс графического Swing компонента связывает модель и представителя с помощью менеджера пользовательского интерфейса (UIManager), который определяет внешний вид и поведение интерфейса (Look and Feel).
Именно поэтому библиотека Swing имеет подключаемую архитектуру look-and-feel.
Вид (look) каждого графического компонента задают его форма, тип и цвет рамки, цвет фона, цвет, тип и размер шрифта, форма курсора мыши.
Поведение компонента (feel) определяют та или иная реакция на действия мыши, набор командных клавиш, способ перемещения окон и т. д.
Таким образом, для реализации модели MVC библиотека Swing использует делегирование (delegation) полномочий, назначая в качестве модели данных представителя (delegate) – экземпляр класса с именем вида xxxModel.
Класс библиотеки Swing содержит защищенное или даже закрытое поле model – объект этого класса-модели, и метод getModel, предоставляющий разработчику доступ к полю model.
Для обеспечения внешнего вида и поведения Swing компонента также используется делегирование полномочий.
Swing класс JComponent содержит защищенное поле ui – экземпляр класса-представителя ComponentUI из пакета javax.swing.plaf, непосредственно отвечающего за вывод изображения на экран в нужном виде.
Класс-представитель содержит методы paint и update, формирующие и обновляющие графику компонента.
Такие представители образуют целую иерархию с общим суперклассом ComponentUI.
Они собраны в пакет javax.swing.plaf и его подпакеты.
В их именах есть буквы UI (User Interface), например, ButtonUI.
Представители класса тоже являются полями класса Swing компонента, и доступ к ним осуществляется методами вида getUI.
Таким образом, каждый компонент имеет UI-делегата, который отвечает за внешний вид и поведение интерфейса (Look and Feel).
Класс UIManager имеет статический метод с именем getUI.
Когда создается какой-либо Swing компонент, он вызывает этот метод для получения UI-делегата.
UIManager знает, какой установлен текущий внешний вид, и таким образом, создается нужный экземпляр UI-делегата.
UIManager содержит текущий внешний вид и поведение в виде объекта LookAndFeel, который определяет сопоставления между идентификаторами классов и UI-делегатами в хэш-таблице UIDefaults.
Эта идея аналогична идее, используемой в библиотеке AWT для создания экземпляров пиров, зависимых от платформы.
LookAndFeel – это абстрактный базовый класс для всех классов внешнего вида и поведения.
Каждая реализация LookAndFeel должна обеспечивать реализацию соответствующего подкласса ComponentUI или UI-делегата, указав значение для каждого из идентификаторов классов Swing компонентов в объекте UIDefaults, который возвращается методом getDefaults LookAndFeel.
Теперь, как установить внешний вид и поведение?
Во-первых, если вы собираетесь установить L & F программным способом, вы должны сделать это как самый первый шаг в своем приложении.
В противном случае вы рискуете инициализировать L & F по умолчанию независимо от того, какой L & F вы затем запросили.
Это может произойти непреднамеренно, когда статическое поле ссылается на класс Swing, что приводит к загрузке L & F по умолчанию.
Как уже было сказано, связующим звеном между компонентом и внешним видом является менеджер UIManager.
При этом класс UIManager хранит доступные L&F в виде массива объектов вложенного класса UIManager. LookAndFeelInfo.
Посмотреть все доступные L&F можно с помощью метода getInstalledLookAndFeels класса UIManager.
Задать один из доступных L&F можно с помощью статического метода setLookAndFeel класса UIManager.
Аргумент этого метода – это строка, содержащая полное имя нужного класса LookAndFeel со всеми подпакетами.
При динамическом изменении L&F нужно в слушателе UIManager вызвать метод updateComponentTreeUI класса SwingUtilities.
В аргументе этого метода нужно указать контейнер верхнего уровня, и этот метод рекурсивно просмотрит все вложенные контейнеры и компоненты, и для каждого компонента установит новый L&F.