Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание 1 часть_В1-В34.docx
Скачиваний:
4
Добавлен:
19.09.2019
Размер:
3.05 Mб
Скачать
  1. Отформатировать текст по стп мгупи. Оформить рисунки и программный кода

Проблема с распорками

Распорки совершенно необходимы при создании интерфейсов с применением блоч­ного расположения компонентов, и как мы посмотрели, работа их выглядит вполне про­зрачно — мы просто вставляем своеобразные «спички» между компонентами. Однако после рассмотрения заполнителей оказывается, что возникает недоразумение с рас­порками, созданными классом Box. Дело в том, что максимальный размер по второй оси (к примеру, по вертикали для горизонтальной распорки) неограничен. Как мы уже выяснили, блочное расположение при наличии свободного пространства в контейне­ре распределяет его поровну между компонентами, которые могут «расти», еще не до­стигнув максимального размера. Так вот, если в панели с блочным расположением по горизонтали имеются стандартные распорки, общий максимальный размер панели по вертикали будет неограничен, и это, как правило, совсем не тот эффект, которого мы хотим добиться. Тоже самое случится и с вертикальными распорками в вертикальной панели.

Поэтому лучше создать распорки самим, не применяя стандартные. Тут нам помогут фиксированные области, у которых одно расстояние будет распоркой, а второе всегда нулевым. Именно такое поведение нам и требуется при разделении компонентов. Доба­вим в наш вспомогательный класс BoxLayoutUtils еще пару удобных методов:

// com/porty/swing/BoxLayoutUtils.java

// Класс для удобной работы с менеджером BoxLayout

package com.porty.swing;

import javax.swing.*;

public class BoxLayoutUtils {

// создает горизонтальную распорку

// фиксированного размера

public static Component createHorizontalStrut(int size) { return Box.createRigidArea(new Dimension(size, 0));

}

// создает вертикальную распорку

// фиксированного размера

public static Component createVerticalStrut(int size) { return Box.createRigidArea(new Dimension(0, size));

)

// далее идут методы, описанные ранее }

Наши распорки созданы на основе уже знакомых нам фиксированных областей и &- дут выполнять те же функции, что и стандартные распорки из класса Box, не устанаа.-ш- вая при этом неограниченным общий максимальный размер панели. А если нам понес бится увеличить максимальный размер панели, мы всегда можем сделать это вручную

Выравнивание компонентов по осям

Выравнивание по осям — достаточно каверзный аспект работы менеджера BoxLayout, и если не знать деталей, расположение вполне может получиться абсолютно противопо­ложным тому, что изначально задумывалось. Вам может дажЬ показаться, что поведение компонентов при блочном расположении вообще непредсказуемо. Впрочем, не все так страшно, и мы постараемся без особых трудностей справиться с выравниванием по осям.

Каждый компонент (унаследованный от класса java.awt.Component) имеет два параме­тра, служащие для его выравнивания по осям X и Y, то есть для его более точного раз­мещения в контейнере. Что это за оси? Рассмотрим сначала вертикальную панель, где компоненты располагаются сверху вниз. Мы можем захотеть изменить горизонтальную позицию компонентов (то есть позицию по оси X) такой панели (вертикальные пози­ции жестко заданы положением компонентов, распорок и заполнителей) — поместить их слева, справа или по центру. Так вот, сделать это путем выравнивания по осям нельзя.

ВНИМАНИЕ

Выравнивание компонентов по осям не позволяет, как это может показаться на первый взгляд, изменить позицию компонентов относительно контейнера. Эти параметры задают положение компонентов относительно друг друга, то есть относительно остальных компонентов, размещенных в контейнере. То есть попытки использовать механизм выравнивания по осям так же, как и при последовательном расположении (FlowLayout), приведут к неудаче.

На самом деле расположение компонента с определенным выравниванием будет за­висеть исключительно от выравнивания и размеров остальных компонентов. Для гори­зонтального выравнивания в классе Component определены следующие константы:

  • Component.CENTER_ALIGNMENT — вертикальная ось будет проходить через середину компонента;

  • Component.LEFT_ALIGNMENT — компонент будет прижат к вертикальной оси своей левой границей;

  • Component. RIGHT_ALIGNMENT — компонент будет прижат к вертикальной оси своей правой границей.

При блочном расположении положение вертикальной оси определяется по компо­нентам с центральным выравниванием, а уже после этого компоненты с другими пара­метрами выравнивания размещаются относительно этой оси. Окончательно разъясня­ет ситуацию рис. 7.2.

Аналогично обстоит дело с вертикальным выравниванием (по оси Y). Требуется та- аде выравнивание в панелях с горизонтальным расположением компонентов, и позво­ляет изменить вертикальные позиции компонентов относительно друг друга (горизон­тальные позиции задаются самим расположением). В классе Component для вертикально­го выравнивания определены следующие константы:

  • Component.CENTER_ALIGNMENT— горизонтальная ось будет проходить через сере­дину компонента;

  • Component.TOP_ALIGNMENT— компонент будет прижат к горизонтальной оси своей верхней границей;

  • Component.BOTTOM_ALIGNMENT— компонент будет прижат к горизонтальной оси своей нижней границей.

Как и ранее, для компонента с центральным выравниванием ось будет проходить через его середину (рис. 7.3, слева).

Если все компоненты имеют выравнивание TOP_ALIGNMENT, то ось проходит сверху контейнера, а все компоненты прижимаются к ней верхней границей, как показано спра­ва на рис. 7.3. Схема для выравнивания BOTTOM_ALIGNMENT выглядит аналогично,

только ось проходит снизу контейнера, а все компоненты прижимаются к ней нижней границей. Так же как длягоризонтального, для вертикального выравнивания компонен­тов можно сказать, что использовать его просто, когда все компоненты в контейнере

имеют одинаковое выравнивание.

Кстати, если вы просмотрите документацию по классу Component, то увидите, что для

задания параметров выравнивания компонентов используются числа с плавающей запя­той (float) от 0 до 1. Можно сказать, что они определяют, какая часть компонента находит­ся за осью. Так, например, константы RIGHT_ALIGNMENT и TOP_ALIGNMENT равны нулю. Это значит, что весь компонент находится по одну сторону от оси (с правой или с ниж­ней стороны, соответственно). Если увеличивать значения выравнивания, то компонент будет потихоньку «переползать» за ось и, в конце концов, окажется по другую ее сторону. Константы LEFT_ALIGNMENT и BOTTOM_ALIGNMENT как раз равны единице (то есть ком­понент находится целиком за осью). Так что это гораздо более тонкий инструмент, чем кажется поначалу, — значения констант соответствуют наиболее вероятным вариантам выравнивания компонентов, но вы также можете и напрямую указывать свои значения, что позволяет очень точно выстраивать компоненты относительно друг друга.

Хотя все это кажется интересным, реальная польза от таких изощренных возмож­ностей блочного расположения практически нулевая. Невероятно сложно, а иногда во­обще невозможно предугадать, как выстроятся компоненты в контейнере, чтобы пра­вильно использовать для них разные варианты выравнивания.

С другой стороны, нет ничего проще совмещения нескольких панелей с блочным

расположением, содержащих по несколько компонентов с одинаковым выравнивани­ем. Любой пользовательский интерфейс можно разбить на горизонтальные и верти­кальные полосы с компонентами, применяя для них подобные панели. Именно такой способ создания интерфейса дает наибольшие преимущества разработчику, и мы всяче­ски рекомендуем его вам. А чтобы задание параметров выравнивания компонентов не отнимало у вас слишком много времени и сил, добавим в наш вспомогательный класс

BoxLayoutUtilsеще пару методов:

// com/porty/swing/BoxLayoutUtils.java// Класс для удобной работы с менеджером BoxLayout

package com.porty.swing; import javax.swing.*; public class BoxLayoutUtils {

// задает единое выравнивание по оси X для // группы компонентов

public static void setGroupAlignmentX(float alignment,

JComponent... cs) { for (JComponent с : cs) { •

с.setAlignmentX(alignment);

JComponent... cs) { for (JComponent с : cs) { с.setAlignmentY(alignment) ;

}

}

// далее идут методы, описанные ранее

}

Теперь, создавая интерфейс с помощью менеджера блочного расположения, смело добавляйте любые нужные вам компоненты, а потом просто передайте массив ссылок на них в один из наших методов. После этого все будет работать именно так, как нужно, и даст отличный результат. Остается заметить, что более или менее сложный интер­фейс не обойдется одной панелью с блочным расположением, и в таком случае для всех вложенных панелей также следует задать единое выравнивание.

Если вы помните, в предыдущем разделе был показан пример, который почему-то работал не так, как нам хотелось. Теперь понятно, почему — у панели было центральное выравнивание, а у кнопки — выравнивание по левой границе. Используя новые методы класса BoxLayoutUtils, можно легко согласовать параметры выравнивания всех компонен­тов, и они займут положенные им места, задуманные нами с самого начала.

  1. Отформатировать таблицу по СТП МГУПИ

  1. Отформатировать текст по СТП МГУПИ, ввести формулы с помощью инструмента MSEquation