Читаем Графические интерфейсы пользователя Java полностью

В простейшем случае создается простая рамка толщиной в один пиксель, в которую слева сверху вставлена строка.

Однако надпись можно вставить в рамку любого типа.

Первым аргументом служит рамка, в которую нужно вставить надпись, второй аргумент – это надпись, третий аргумент – это выравнивание надписи по горизонтали, четвертый аргумент – это расположение надписи на рамке, пятый аргумент – это шрифт, и шестой аргумент – это цвет надписи.

Класс 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.

Перейти на страницу:

Похожие книги

Programming with POSIX® Threads
Programming with POSIX® Threads

With this practical book, you will attain a solid understanding of threads and will discover how to put this powerful mode of programming to work in real-world applications. The primary advantage of threaded programming is that it enables your applications to accomplish more than one task at the same time by using the number-crunching power of multiprocessor parallelism and by automatically exploiting I/O concurrency in your code, even on a single processor machine. The result: applications that are faster, more responsive to users, and often easier to maintain. Threaded programming is particularly well suited to network programming where it helps alleviate the bottleneck of slow network I/O. This book offers an in-depth description of the IEEE operating system interface standard, POSIX (Portable Operating System Interface) threads, commonly called Pthreads. Written for experienced C programmers, but assuming no previous knowledge of threads, the book explains basic concepts such as asynchronous programming, the lifecycle of a thread, and synchronization. You then move to more advanced topics such as attributes objects, thread-specific data, and realtime scheduling. An entire chapter is devoted to "real code," with a look at barriers, read/write locks, the work queue manager, and how to utilize existing libraries. In addition, the book tackles one of the thorniest problems faced by thread programmers-debugging-with valuable suggestions on how to avoid code errors and performance problems from the outset. Numerous annotated examples are used to illustrate real-world concepts. A Pthreads mini-reference and a look at future standardization are also included.

David Butenhof

Программирование, программы, базы данных
Разработка ядра Linux
Разработка ядра Linux

В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.

Роберт Лав

Программирование, программы, базы данных / Программирование / Книги по IT