Шрифт:
Интервал:
Закладка:
В этом примере мы создаем объект Action, определяющий имя кнопки панели инструментов, горячие клавиши и всплывающую подсказку.
Border
Каждый JComponent это прямоугольная область на экране с границами.
Границы или стороны прямоугольника могут быть выделены каким-то образом на экране.
Библиотека Swing позволяет изменить оформление границ любого компонента, обведя его рамкой разного вида.
Хотя технически вы можете установить рамку для любого объекта, который наследуется от класса JComponent, внешний вид некоторых стандартных компонентов Swing не очень хорошо работает с пользовательскими рамками.
В общем случае, когда вы хотите установить свою рамку для стандартного компонента Swing, рекомендуется поместить компонент в панель JPanel и установить рамку для этой панели.
Чтобы разместить рамку вокруг компонента JComponent, используется метод setBorder, который в качестве аргумента принимает объект Border.
Интерфейс Border описывает общие свойства всех рамок.
Его метод paintBorder отвечает за рисование рамки для указанного компонента с указанным положением и размером.
Рамка может быть прозрачной или не прозрачной. Это определяется логическим методом isBorderOpaque.
Последний метод интерфейса, getBorderInsets, возвращает пространство, занятое рамкой данного компонента, в виде экземпляра класса Insets.
В классе Insets это пространство определяется толщиной рамки сверху, слева, справа и снизу.
Интерфейс Border частично реализован абстрактным классом AbstractBorder, в котором определена пустая реализация метода paintBorder, метод isBorderOpaque возвращает false, а метод getBorderInsets – возвращает объект с нулевыми значениями.
Кроме этих реализаций в классе AbstractBorder есть метод getInteriorRectangle, который удобно использовать для определения размеров самого компонента без рамки.
Класс AbstractBorder расширяют около двадцати классов, рисующие разные рамки.
Для удобства работы с ними имеется класс BorderFactory, в котором собраны статические методы вида createXxxBorder () для различных типов рамок с разными параметрами.
Поэтому для создания рамки достаточно использовать один из этих методов, а затем установить полученную рамку в компонент методом setBorder.
Класс EmptyBorder представляет самую простую рамку.
Это пустое пространство, окружающее компонент.
Класс LineBorder определяет одноцветную рамку заданной толщины, одинаковой на всех сторонах рамки.
Первый аргумент задает цвет рамки, второй аргумент задает толщину рамки и третий аргумент создает рамку с закругленными краями.
Рамка BevelBorder состоит из двух линий: светлой и темной.
Если светлая линия расположена сверху и слева, а темная справа и снизу, то создается впечатление падения света сверху слева и компонент выглядит выпуклым.
Это тип RAISED, он указывается как первый аргумент.
Если же поменять местами темные и светлые линии, тогда компонент выглядит вдавленным в поверхность контейнера.
Это тип LOWERED.
Класс SoftBevelBorder расширяет класс BevelBorder, создавая рамки со слегка закругленными, смягченными краями.
Класс EtchedBorder создает объемную рамку врезанную или вдавленную в контейнер в зависимости от типа.
Рамка MatteBorder может состоять из повторяющегося изображения, или из линий разной толщины, но одного и того же цвета.
Аргументами метода служат размеры рамки в пикселях и изображение или цвет.
Класс TitledBorder позволяет создать рамку с надписью.
В простейшем случае создается простая рамка толщиной в один пиксель, в которую слева сверху вставлена строка.
Однако надпись можно вставить в рамку любого типа.
Первым аргументом служит рамка, в которую нужно вставить надпись, второй аргумент – это надпись, третий аргумент – это выравнивание надписи по горизонтали, четвертый аргумент – это расположение надписи на рамке, пятый аргумент – это шрифт, и шестой аргумент – это цвет надписи.
Класс 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 можно с помощью статического метода
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- Как спроектировать современный сайт - Чои Вин - Программирование
- Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2 - Александр Фролов - Программирование
- Программирование на Java - Н.А. Вязовик - Программирование
- ИНФОРМАЦИОННАЯ ТЕХНОЛОГИЯ. РУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ - ГОССТАНДАРТ РОССИИ - Программирование
- Каждому проекту своя методология - Алистэр Коуберн - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Как почистить сканы книг и сделать книгу - IvanStorogev? KpNemo - Программирование