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

Вариант № 1

  1. Отформатировать текст по СТП МГУПИ. Оформить рисунки и программный кода

Работа менеджера расположения происходит следующим образом: он ждет прихода сигнала от контейнера, требующего расположить в нем компоненты (этому соответству­ет вызов метода layoutContainer() из интерфейса LayoutManager). В методе layoutContainer() и происходит основная работа по расположению компонентов в контейнере. Менеджер расположения, принимая во внимание различные размеры и свойства компонентов

2 Мы подробно обсуждали механизмы (к слову, довольно сложные) работы метода revalidate() в гла­ве 5. Как правило, проверка корректности не вызывает проблем, но если вы вдруг оказались в слож­ной ситуации, ответ можно найти в упомянутой главе 5.

сти для любого компонента Swing, будь это контейнер или отдельный компонент, по­зволяет метод revalidate(), определенный в базовом классе библиотеки JComponent2 .•

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

  • Предпочтительный размер. Такой размер идеально подходит данному компоненту. По умолчанию все размеры компонентов устанавливаются UI-представителями текущего внешнего вида и поведения (lookandfeel), но вы можете изменить их. Предпочтительный размер можно изменить с помощью метода SetPrefferedSize().

  • Минимальный размер. Этот параметр показывает, до каких пор менеджер располо­жения может уменьшать размер компонента. После достижения минимального размера всех компонентов контейнер больше не сможет уменьшить свой размер. Минимальный размер также можно изменить, для этого предназначен метод setMinimumSize().

  • Максимальный размер. Этот параметр говорит о том, насколько можно увеличивать компонент при увеличении размеров контейнера. Например, максимальный раз­мер текстового поля JTextField не ограничен, что не всегда удобно (чаще всего оно должно сохранять свой предпочтительный размер). Эту оплошность мы сможем исправить с помощью метода setMaximumSize(), устанавливающего максимальный размер. Большая часть менеджеров расположения игнорируют максимальный раз­мер, работая в основном с предпочтительным и минимальным размерами.

  • Выравнивание по осям Хи Y. Эти параметры нужны только менеджеру BoxLayout, при­чем для него они играют важнейшую роль. Поэтому их мы рассмотрим, когда дой­дем до описания этого менеджера.

  • Границы контейнера. Эти параметры контейнера, которые позволяет получить ме­тод getlnsets(), определяют размеры отступов от границ контейнера. Иногда менед­жеру расположения приходится их учитывать. В Swing и для компонентов, и для контейнеров применяются рамки Border, которые находятся прямо в пространстве компонента, отдельных отступов нет, что делает работу компонентов Swing более простой и предсказуемой.

  • Базовая линия. Типографский термин, обозначающий основание букв, по которому выравниваются строки текста. Для компонентов интерфейса это означает, что су­ществует линия, по которой выравнивание компонента будет оптимальным, к при­меру, базовая линия текста в текстовом поле и базовая линия текста надписи на кнопке. В противном случае менеджер расположения не знает, как выравнивать компоненты и сможет выровнять их только по верхней и нижней границе или по центру, что может привести к неудовлетворительным результатам и визуальному расхождению. Для определения базовой линии предназначен метод getBaseline(), который в своих компонентах можно переопределять.

  • и контейнера, должен расположить компоненты на определенных позициях в контей­нере, вызывая для каждого из них метод setBounds(), позволяющий указать (в пикселах, в системе координат контейнера) прямоугольник, который будет занимать компонент. Для сложных менеджеров расположения с гибким поведением это означает массу ра­боты и сложные вычисления, однако простые алгоритмы расположения компонентов реализовать совсем несложно. Попробуем теперь написать свой первый менеджер рас­положения компонентов, он будет располагать компоненты вертикально с расстоянием между ними в 5 пикселов и использовать для всех компонентов предпочтительный раз­мер. Вот что у нас получится:

  • // VerticalLayout.java

  • // Простой менеджер расположения, располагает // компоненты в вертикальный ряд с отступами import java.awt.*; import javax.swing.*;

  • public class VerticalLayout implements LayoutManager {

  • // отступ между компонентами public int GAP = 5;

  • // сигнал расположить компоненты в контейнере public void layoutContainer(Container с) {

  • Component comps[] = с.getComponents();

  • int currentY = GAP;

  • for (Component comp : comps) {

  • // предпочтительныйразмеркомпонентаDimension pref = comp. getPreferredSize (') ;

  • // указываемположениекомпонентанаэкранеcomp.setBounds{GAP, currentY, pref.width, pref.height) ;

  • // промежутокмеждукомпонентамиcurrentY += GAP; currentY += pref.height;

  • }

  • }

  • // эти два метода нам не понадобятся public void addLayoutComponent(

  • String name, Component comp) {

  • }

  • public void removeLayoutComponent(

  • Component comp) (

  • }

  • // минимальныйразмердляконтейнераpublic Dimension minimumLayoutSize(Container c) { return calculateBestSize(c);

  • }

  • // предпочтительныйразмердляконтейнераpublic Dimension preferredLayoutSize(Container с) { return calculateBestSize(с);

  • }

  • private Dimension size = new Dimension();

  • // вычисляетоптимальныйразмерконтейнера1private Dimension calculateBestSize(Container c) {

  • // сначалавычислимдлинуконтейнераComponent!] comps = с.getComponents(); int maxWidth = 0; for (Component comp : comps) { int width = comp.getWidth();

  • // поиск компонента с максимальной длиной if (width > maxWidth) maxWidth = width;

  • }

  • // длина контейнера с учетом левого отступа size.width = maxWidth + GAP;

  • // вычисляем высоту контейнера int height = 0;

  • for (Component comp : comps) { height += GAP; height += comp.getHeight();

  • }

  • size.height = height; return size;

  • }

  • // проверимработуновогоменеджераpublic static void main(String[] args) {

  • SwingUtilities.invokeLater( new Runnable() {

  • public void run() {

  • JFrame frame = new JFrame("VerticalLayout"); frame.setDefaultCloseOperation(

  • JFrame.EXIT_ON_CLOSE);

  • // панельбудетиспользоватьновоерасположениеJPanel contents = new JPanel( new VerticalLayout());

  • // добавим пару кнопок и текстовое поле

  • contents.add(new JButton("Один")); contents.add(new JButton("Два")); contents.add(new JTextField(30)); frame.add(contents); frame.setvisible(true); frame.pack(); } });

  • }

  • }

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

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

§ 1. Основные понятия теории метода сеток

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

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

Вариант № 2

  1. Отформатировать текст по стп мгупи. Оформить рисунки и программный кода

Наш первый менеджер расположения, получивший название VerticalLayout, как и по­ложено любому менеджеру расположения, реализует интерфейс LayoutManager. Первый метод, который нам придется реализовать, одновременно является и самым важным — именно в методе layoutContainer() менеджер расположения должен расположить все ком­поненты, содержащиеся в контейнере, по своим местам. Поведение нашего менеджера расположения незамысловато: он размещает компоненты в вертикальный ряд, отделяя их расстоянием в 5 пикселов (расстояние хранится в переменной GAP), все компоненты имеют предпочтительный размер. Чтобы реализовать такое поведение, понадобились следующие действия: мы просмотрели массив содержащихся в контейнере компонен­тов (получить этот массив позволяет метод контейнера getComponentsO), получили для каждого из компонентов предпочтительный размер и указали (методом setBounds()) по­зицию компонента на экране, постоянно отслеживая текущую координату по оси Y, уве­личивая ее на высоту очередного компонента с учетом «декоративного» расстояния из переменной GAP. Так все компоненты будут располагаться друг над другом, отделенные отступами4. Обратите внимание, что мы отделяем компоненты и от левой границы кон­тейнера на то же самое расстояние.

Далее следуют два метода, служащие для добавления и удаления компонентов из спи­ска компонентов менеджера расположения. Заметьте, что метод addLayoutComponent() по­зволяет ассоциировать с компонентом строку, которая может быть использована менед­жером расположения как рекомендация относительно того, где именно программист- клиент желает видеть данный компонент. Наш простой менеджер расположения не поддерживает подобных рекомендаций, просто располагая все компоненты контейне- j ра в вертикальный ряд, однако более сложные расположения, к примеру, полярное pa:- j положение BorderLayout, которое мы вскоре изучим, используют эти строки для бог.еп 1 тонкого управления местом компонента в контейнере.

Следующими являются два метода, сообщающие предпочтительный (preferredLayotr- | Size()) и минимальный (minimumLayoutSize()) размеры контейнера при использован»?* I в нем данного менеджера расположения. Когда в контейнере работает менеджер pi: Щположения, именно он запрашивается о том, каков должен быть предпочтительный ап I минимальный размер контейнера, и это вполне объяснимо: менеджер расположения par- пределяет место на экране, так что он должен знать, сколько этого места в контейнере 1 требуется для правильной работы. Для нашего простого менеджера расположения Я нимальный и предпочтительный размеры контейнера совпадают, их вычисляет метсж 1 calculateBestSize(). Вычислить оптимальный размер контейнера несложно. Для начала ян в цикле ищем компонент с самой большой длиной, прибавляем к найденной длине pa»- 1 мер отступа от левой границы контейнера из поля GAP и получаем оптимальнуюдтщя контейнера. Для высоты вычисления чуть сложнее: приходится складывать высоты всшЛ

Обратите внимание, что наш просто менеджер расположения не принимает во внииаяшЛ видим ли компонент на экране, когда отсчитывает позиции. Компонент вполне может находзга^Я в контейнере, но быть невидимым, и тогда его следует исключать из расчетов. Для простоты анЛ мера мы опустили эту проверку.

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

После реализации всех методов интерфейса LayoutManagerмы сможем проверить но-зый менеджер расположения в работе. Для этого в методе mainQмы создаем небольшое : хно с рамкой JFrameи добавляем в это окно панель JPanel, устанавливая для нее наш новый менеджер расположения. В панель добавляется пара кнопок и довольно большое “екстовое поле, после чего окно выводится на экран. Чтобы оценить правильность рас­чета нашим менеджером оптимальных размером, мы вызываем метод раск(), который придает окну предпочтительный размер. Запустив программу с примером, вы сможете : ценить, как компоненты располагаются вертикально друг над другом, и верно ли был проведен расчет оптимальных размеров.

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

Стандартные менеджеры расположения

В пакете разработки JDK 1.7 имеется довольно много готовых стандартных менеджеров расположения. Условно их можно разделить на несколько групп: очень простые (к ним от­носятся FlowLayout, GridLayoutи BorderLayout), универсальные (к таким без всяких сомнений стоит отнести расположения BoxLayout, GroupLayoutи GridBagLayout) и специализированные CardLayoutи SpringLayout).Универсальные менеджеры мы рассмотрим в последнюю оче­редь и наиболее подробно, а пока быстро «пройдемся» по всем остальным менеджерам.

Полярное расположение BorderLayout

Менеджер BorderLayoutспециально предназначен для обычных и диалоговых окон, потому что позволяет быстро и просто расположить наиболее часто используемые эле­менты любого окна: панель инструментов, строку состояния и основное содержимое. Для этого окно разбивается им на четыре области, или полюса (отсюда его название), а все оставшееся место заполняется компонентом, выполняющим основную функцию приложения (например, в редакторе это будет текстовое поле, в многооконном прило­жении — рабочий стол).

Надо сказать, что работает этот менеджер немного не так, как все остальные — чтобы добавить с его помощью компонент, в методе add() необходимо указать дополнительный

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

  • Значение BorderLayout.NORTHили строка «North» — компонент располагается вдоль верхней (северной) границы окна и растягивается на всю его ширину. Обычно так размещается панель инструментов.

  • Значение BorderLayout.SOUTHили строка «South» — компонент располагается вдоль нижней (южной) границы и растягивается на всю ширину окна. Такое положение идеально для строки состояния.

  • Значение BorderL.ayout.WESTили строка «West» — компонент располагается вдоль левой (западной) границе окна и растягивается на всю его высоту, однако при этом учитываются размеры северных и южных компонентов (они имеют приоритет).

  • Значение BorderLayout.EASTили строка «East» - компонент располагается вдоль правой (восточной) границы окна. В остальном его расположение аналогично за­падному компоненту.

  • Значение BorderLayout.CENTERили строка «Center» — компонент помещается в центр окна, занимая максимально возможное пространство/

СОВЕТ

На север помещайте панель инструментов вашего приложения. На юг поме­щайте строку состояния. Оставляйте западные и восточные зоны окна сво­бодными — только в этом случае панель инструментов можно будет перета­скивать. Для главного окна вашего приложения всегда используйте располо­жение BorderLayout.

Рассмотрим простой пример. В нем создается окно JFrame, в котором менеджер Border­Layoutиспользуется по умолчанию. Во все доступные зоны добавляются компоненты:

// BorderLayoutSample.java

// Полярное расположение

import javax.swing.*;

import java.awt.*;

public class BorderLayoutSample extends JFrame { public BorderLayoutSample() { super("BorderLayoutSample"); setSize(400, 300);

setDefaultCloseOperation( EXIT_0N_CL0SE );

// добавляемкомпоненты

// в качестве параметров можно использовать строки add(new JButton("Север"), "North"); add(new JButton("Юг") , "South");

// ... или константы из класса BorderLayout add(new JLabel("Запад"), BorderLayout.WEST); add(new JLabel("Восток"), BorderLayout.EAST);

// если параметр не указывать вовсе, компонент // автоматически добавится в центр add(new JButton("Центр"));

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

}

public static void main(String[] args) {

SwingUtilities.invokeLater(

new Runnable() { public void run() { new BorderLayoutSample(); ) });

}

)

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

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

является приближением к точному решению исходной задачи. Значения решения системы (5)-(6) можно находить последовательно при каждом

Вариант № 3