Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кпп.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
238 Кб
Скачать
☆

Библиотека Swing.

Состоит из "легких" компонентов, во многом полностью соответствующим компонентам AWT. Для её применения достаточно, чтобы в системе был установлен пакет Java Runtime Envirioment (JRE). На данный момент содержит более 500 классов и интерфейсов, предоставляющих программистам все необходимые и все мыслимые возможности.

Однако для построения стандартного интерфейса вполне достаточно классов, расположенных в пакете javax.swing.

Почти все классы Swing начинаются с заглавной буквы J (JFrame, JTable, Jmenu…).

Например:

 JInternalFrame  -  Окно, размещаемое внутри другого окна, к примеру, JFrame

JProgressBar    -   Автоматический ползунок, отображающий % выполнения чего – либо.

JSlider               -  Ползунок для выбора какой – либо величины с помощью мыши

JTable               -  Компонент для вывода данных в виде таблицы

JTree                  -  Компонент для вывода данных в виде иерархического списка 

 Как видно из схемы на рис.1, большинство базовых классов Swing наследуются от класса Container. Несмотря на то, что в библиотеке Swing много классов, наследуемых от различных уровней иерархии, вплоть до базового класса Object, именно класс Container можно считать базовым для большинства базовых классов Swing. Это позволяет программистам, хорошо знакомым с AWT совершенно прозрачно перейти на Swing.

Более того, классы этих библиотек настолько хорошо совместимы, что можно импортировать и использовать обе эти библиотеки в одном приложении. Классы Swing имеют аналогичные названия и полный набор аналогичных AWT методов, что позволяет программистам использовать Swing таким же точно образом, как и AWT и не переучиваться. Однако в совместном использовании этих двух библиотек есть небольшой, но очень существенный нюанс. Как вы помните, компоненты AWT являются "тяжеловесными" и зависят от конкретного способа отрисовки окон операционной системой. Это означает, что ОС может напрямую с ними взаимодействовать. И когда ОС передает всем окнам команду на перерисовку, этой команде подчиняются так же и окна, созданные на основе AWT. В противоположность им, компоненты Swing являются "легковесными". Это означает, что они находятся только в пространстве окна приложения java, который для них является контейнером верхнего уровня, и не взаимодействуют с ОС напрямую. Поэтому когда ОС дает команду на общее обновление окон, перерисовывается так же и контейнер верхнего уровня, но это не значит, что "легковесные" компоненты Swing автоматически перерисовываются вместе с ним. Следствием этого является то, что каким бы способом мы не размещали "легковесные" компоненты поверх "тяжеловесных", они постоянно оказываются выше и прекрывают компоненты Swing. В этом нет никакой проблемы, если используются только статичные компоненты вроде кнопок, флажков и текстовых полей ввода, однако проблема "встает во весь рост" при попытке совместного использования компонентов AWT и компонентов Swing, которые могут изменяться на форме, к примеру, выпадающих списков, дочерних окон, всплывающих подсказок и т.д.

Представьте, что у вас на форме остаются "следы" от выпадающего списка или часть формы перерисовывается, а часть – нет.

Поскольку отледить эти взаимодействия элементов управления бывает затруднительно, совместное использование Swing и AWT из практических соображений не рекомендуется.

 Второе значительное отличие компонентов Swing от компонентов AWT заключается в том, что компоненты Swing построены на основе паттерна MVC. Этот паттерн проектирования предполагает, что функции получения и обработки данных, управления отображением компонентов и непосредственно сама отрисовка разнесены по различным функциональным модулям, как показано на рисунке:

Контроллер является звеном, непосредственно взаимодействующим с пользователем. Это то, что составляет UI – пользовательский интерфейс. Контроллер, реагируя на события, обращается к методам Модели, обычно это сеттеры (функции типа setЧто-либо). Объекты Модели меняют хранящуюся в них информацию и сообщают об этом видам, которые зарегестрированы в Модели. Этот способ взаимодействия называется подписка – рассылка.

Виды подписываются у Моделей и те рассылают им сообщения о всяком изменении состояния объекта через вызовы функций fireXx(). После этого Виды забирают измененную информацию, обращаясь к методам getЧто-то() и isЧто-то() Модели.

 В библиотеке Swing Модели соответствуют интерфейсам, в которых присутствуют необходимые методы. Каждый интерфейс имеет хотя бы одну стандартную реализацию.

Таким образом Контроллер связан с нажатием кнопок, перетаскиванием ползунков на форме и вводом текста в поля ввода, а Вид меняет внешнее отображение этих графических компонент на форме, получив от Модели сообщение о произошедших изменениях.

Вся эта машинерия упакована внутрь реализации библиотеки совершенно прозрачно для программиста, поэтому обычно программисту не приходится беспокоиться о взаимодействии отдельных компонентов MVC или пытаться что-то с ней делать.

Однако реализация паттерна MVC в библиотеке Swing предполагает, что если программиста по каким – то причинам не удовлетворяет стандартная реализация отдельных компонентов, то он может, например, получить экземпляр модели с помощью вызова метода getModel() из класса компонента и попытаться что –либо с ним сделать. Заменить например реализацию на свою. Например, в каждом объекте Jbutton хранится объект модели, который можно оттуда получить:

 Jbutton  button  =  new Jbutton("OK");

ButtonModel  model  =  button.getModel();

 Обычно модели кнопок хранят сведения о состоянии – нажата кнопка, отпущена, или заблокирована. Но в соответствии с парадигмой MVC в них не хранится информация об их внешнем виде, например, в ней не хранится название кнопки и её пиктограмма.

Внешний вид кнопок хранится в полях самого класса.

Пример простого шаблона приложения, использующего Swing:

import  java.awt.*;

import.javax.swing.*;

public class  SwingApp  extends  Jframe  {

     public  SwingApp  (String  name_programm) {

            Super(name_programm);  // вызываем суперкласс для создания родительского окна

            Container  с  =  getContentPane();   // создаем экземпляр контейнера

            c.add(какой-либо_компонент);    // можно без контейнера, просто this.add(xxx);

            setSize(длина, высота);

setDefaultCloseOperation(EXIT_ON_CLOSE);  // обработка кнопки закрытия окна

setVisible(true);  // выводим окно на экран    } 

    public  static  void  main(String[]  args) {

            new SwingApp("Имя_программы");

    }

}