Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Файловые диалоги




Кроме стандартного обобщенного класса диалога существует подкласс класса Dialog - специальный класс FileDialog, позволяющий открывать и сохранять файлы. Эти диалоги функционируют в соответствии с требованиями той платформы, на которых выполняется программа и с их помощью можно получить дескрипторы файлов для загрузки или сохранения через потоковый класс.

Рассмотрим примеры создания файловых диалогов:

FileDialog getFile=new FileDialog(this, // ссылка на окно родителя

"Get a file...", // заголовок диалога

FileDialog.LOAD); // тип диалога

getFile.show();

FileDialog saveFile=new FileDialog(this,"Save a file...",FileDialog.SAVE);

saveFile.show();

2. Менеджеры размещения компонентов

Способ размещения компонентов в контейнере зависит от менеджера компоновки, ассоциированного с этим контейнером. С помощью этих менеджеров можно легко и быстро обеспечить необходимое расположение компонентов относительно друг друга и включающего их контейнера. Этот механизм позволяет с легкостью решать такие задачи, как, например, динамическое изменение расположения компонентов в зависимости от меняющейся величины окна. JDK содержит несколько готовых менеджеров размещения, которые пригодны для построения интерфейсов в большинстве апплетов. Каждый класс менеджера имеет методы и конструкторы, которые позволяют выбирать различные компоновки.

2.1 Типы менеджеров размещения

К простейшим менеджерам относятся FlowLayout и GridLayout, к более сложным - BorderLayout, CardLayout и GridBagLayout. По умолчанию в окне апплета и всех создаваемых панелях используется менеджер FlowLayout, а во фреймах и диалоговых окнах - менеджер BorderLayout. Для изменения типа менеджера размещения в контейнере используется метод setLayout() класса контейнеров (предварительно необходимо создать объект нового менеджера размещения). Для получения ссылки на используемый в контейнере менеджер размещения существует метод контейнера getLayout() При помощи этой ссылки на менеджер можно использовать методы менеджера для выполнения различных действий.

В классы всех менеджеров размещения входят методы для обеспечения размещения компонент. Метод layoutContainer() предназначен для того, чтобы компоненты могли установить для себя предпочтительный размер. Определение минимального размера окна контейнера (с учетом остальных компонент в родительском контейнере), необходимого для размещения всех компонент производится методом minimumLayoutSize(). Для определения предпочтительного размера окна контейнера (с учетом остальных компонент в родительском контейнере), необходимого для размещения всех компонент служит метод prefferedLayoutSize().

Менеджер размещения FlowLayout

Принцип действия менеджера FlowLayout очень прост и сводится к следующему: каждый новый добавляемый компонент помещается в текущий горизонтальный ряд слева направо, если в этом ряду есть еще место, а если нет - то компонент смещается вниз и начинает следующий горизонтальный ряд. Содержимое каждого ряда выравнивается. Менеджер FlowLayout поддерживает три типа выравнивания: влево, вправо и по центру (режим по умолчанию). Тип выравнивания, а также величину отступов между компонентами по вертикали и горизонтали можно задать в конструкторе при создании объекта FlowLayout.

Менеджер размещения GridLayout

Менеджер FlowLayout не обеспечивает гибкого управления размещением компонентов на экране. В этом режиме компоненты просто последовательно размещаются слева направо, переходя на более нижний ряд, если в этом ряду больше нет места. Причем при изменении размера окна контейнера (когда происходит переразмещение компонентов) состав компонентов в ряду может изменится из-за того, что некоторые компоненты могут перейти в другой ряд (выше или ниже) в силу изменения ширины окна контейнера. При помощи менеджера GridLayout можно точно указать, где именно разместить тот или иной компонент, достичь ровного, единообразного размещения компонентов. Этот менеджер создает решетку («таблицу»), состоящую из квадратов одинакового размера, в каждом из которых располагается один компонент. При использовании этого режима компоненты размещаются слева направо и сверху вниз по одному компоненту на квадрат. При помощи конструкторов класса GridLayout при создании объектов этого класса можно задать число сток и столбцов этой «таблицы», а также величину отступов между строками и столбцами.

Менеджер размещения BorderLayout

При использовании менеджера BorederLayout окно контейнера разделяется на рамку и центральную часть. При размещении компонентов указывается направление от центра окна, в котором следует размещать компоненты (компоненты размещаются вдоль границ окна контейнера). Каждый раз при добавлении нового компонента в контейнер необходимо указывать дополнительный параметр, который может принимать одно из следующих значений: "South" («юг», внизу), "North" («север», вверху), "East" («восток», вправо), "West" («запад», влево) и "Center" (в центре). Первые четыре параметра заставляют менеджер BorderLayout относить добавляемые компоненты к соответствующему краю контейнера - нижнему, верхнему, правому и левому. Параметр "Center" позволяет указать, что данный компонент может занять все оставшееся место. Таким образом, элементы, добавляемые с параметром "Center", будут изменять свой размер, заполняя место, не занятое другими компонентами, при изменении размеров окна контейнера.

Менеджер размещения CardLayout

Этот менеджер размещения позволяет изменять набор компонентов, выводимых на экран, прямо во время работы апплета. Режим CardLayout предназначен для создания набора диалоговых панелей («блокнота»), которые можно показывать по очереди в одном окне. Этот менеджер (в отличии от ранее рассмотренных) отображает одновременно только один компонент (элемент управления или контейнер) по аналогии с колодой карт. Можно явно указать, какой из компонентов сделать видимым. Обычно для управления процесса перебора диалоговых панелей в режиме CardLayout используются отдельные органы управления, расположенные в другой панели. Рассмотрим, как пользоваться режимом размещения CardLayout. Обычно в окне апплета создается две панели, одна из которых предназначена для страниц «блокнота» в режиме размещения CardLayout, а другая содержит органы управления перелистыванием страниц, например, кнопки. Такие методы как first(), last(), next()и previous(), позволят отображать соответственно первую, последнюю, следующую и предыдущую страницу «блокнота». Если вызвать метод next() при отображении последней страницы, в окне появится первая страница. Аналогично при вызове метода previous() для первой страницы отображается последняя страница. Для того, чтобы отобразить произвольную страницу, используется метод show(). Однако, этот метод позволяет отображать только те страницы, при добавлении которых в контейнер использовался такой метод add(), при помощи которого можно вводить компонент, указывая название компонента и ссылку на сам компонент.

Менеджер размещения GridBagLayout

Менеджер GridLayout работает так, что в каждой ячейке может быть только один компонент. Иногда возникает необходимость разместить один компонент в нескольких ячейках. Режим GridBagLayout позволяет размещать компоненты разного размера в таблице, задавая при этом для отдельных компонент размеры отступов и количество занимаемых ячеек. Менеджер GridBagLayout является самым сложным менеджером компоновки. В нем используется наиболее совершенный алгоритм реагирования на изменение размеров контейнера, и позволяет реализовывать сложный интерфейс, в котором контейнер содержит много компонентов различных размеров, некоторые из которых должны находиться в одном и том же заданном положении относительно других. Когда используется этот менеджер, необходимо задавать параметры расположения для каждого компонента с помощью метода setConstraints(). Удобнее всего создать для каждого компонента экземпляр класса GridBagConstraints, что позволит изменять расположение этого компонента независимо от других.

Выбор менеджера размещения

Рассмотрим краткие формулировки основных рекомендаций по применению каждого из рассмотренных менеджеров.

Что необходимо? Что использовать?
Быстро разместить все компоненты, не обращая внимания на совершенство композиции FlowLayout
Быстро и по возможности красиво расположить все компоненты BorderLayout
Разместить компоненты, имеющие одинаковый размер GridLayout
Разместить компоненты, некоторые из которых имеют одинаковый размер Рекомендуется использовать GridLayout в отдельной панели, собрав в нее компоненты, имеющие одинаковый размер, а все остальные компоненты вынести за пределы этой панели
Выводить компоненты на экран по мере необходимости CardLayout
Отображать некоторые компоненты постоянно, а некоторые - по мере необходимости Рекомендуется использовать CardLayout в панели, предназначенной для вывода компонентов по мере необходимости, а постоянно отображаемые компоненты вынести за пределы этой панели.
Иметь как можно больше контроля над расположением компонентов, а также обеспечить разумную реакцию на изменение размеров контейнера GridBagLayout

 

При использовании в контейнере нескольких панелей вполне можно установить для каждой панели свой менеджер размещения, отличающийся от менеджеров соседних панелей и менеджера всего контейнера. Например, если в большой панели используется GridBagLayout, то для вложенной в нее панели меньших размеров вполне можно выбрать CardLayout.

Когда создается новый контейнер, ему присваивается менеджер размещения по умолчанию. Чтобы изменить менеджер размещения, действующий в данном контейнере, используется выражение типа

setLayout(new BorderLayout());

Если в контейнере имеется несколько вложенных компонент-контейнеров, то при задании менеджеров размещения для них нужно указать, в каком контейнере он будет действовать, например:

inputPanel.setLayout(new BorderLayout());

Добавление компонентов к контейнеру, для которого установлен отличающийся от стандартного менеджер размещения, имеет только одно отличие от обычного способа, а именно - может понадобиться передавать методу add() контейнера какие-то параметры расположения, например:

leftPanel.add("North",radioField);

При использовании менеджера GridBagLayout параметры передаются в объекте специального класса GridBagConstraints, с помощью которого можно установить для каждого компонента значения определенных параметров расположения.

Как правило, компоненты добавляются один за другим в пределах одного горизонтального ряда, пока в этом ряду остается свободное место; следующий добавляемый компонент начинает следующий ряд. Этому правилу в каком-то смысле подчиняется даже BorderLayout - когда добавляется несколько компонентов с одним и тем же параметром расположения (например, "North"), они размещаются в своей части контейнера по тому же закону.

3. Поведение контейнера при наличии элементов управления

При использовании в контейнере элементов управления в поведении контейнера возникают некоторые странности.

Во-первых, при попадании указателя мыши на элементы управления возникает событие MOUSE_EXIT, а при переводе указателя назад в окно контейнера следует событие MOUSE_ENTER. Вывод: области, занятые элементами интерфейса, исключаются из окна контейнера, и события от мыши в этих областях не обрабатываются.

Во-вторых, не происходит ни одного вызова обработчиков нажатий и отпусканий клавиш клавиатуры. Это говорит о том, что контейнера не имеет фокуса ввода. Нет фокуса и у элементов интерфейса. Если нажать клавишу <Tab>, то передачи фокуса не происходит. Вывод: после создания контейнера фокуса ввода нет ни у одного элемента интерфейса.

Если необходимо, чтобы нажатия клавиш отслеживались аплетом, нужно сделать так, чтобы аплет получил фокус. Для получения фокуса ввода этого для контейнера нужно вызвать метод requestFocus().

Если, например, в методе init() в апплет ввести несколько элементов управления, и затем для апплета вызвать метод requestFocus(), тогда при нажатии на кнопки клавиатуры обработчики нажатий и отпусканий клавиш начнут вызываться. Если нажать клавишу <Tab>, фокус ввода перейдет к кнопке. При этом также вызываются обработчики lostFocus() и gotFocus(), отмечающие потерю фокуса ввода одним элементом и получение его другим.

4. Приложение PanelsDemo1

Задание. Создать апплет двойного назначения PanelsDemo1, в окне которого создаются две панели, расположенные горизонтально (для окна апплета используется менеджер размещения GridLayout). Первая из панелей используется как «блокнот», на каждой странице которого находится кнопка (всего 3 «страницы», панель использует менеджер размещения CardLayout). Вторая панель содержит две управляющие кнопки «Previous» и «Next», позволяющие перебирать страницы «блокнота» по очереди. При нажатии на кнопки первой панели в строке состояния навигатора должно отображаться название нажатой кнопки.




Поделиться с друзьями:


Дата добавления: 2014-11-20; Просмотров: 683; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.024 сек.