Лекции (989962), страница 57
Текст из файла (страница 57)
Менеджер расположенияАпплет может содержать такие элементы управления, как кнопки, флажки, раскрывающиеся списки и т.д.Подробнее об этом будет сказано ниже. Однако, прежде чем переходить к описанию синтаксиса этихэлементов, необходимо рассмотреть понятие "менеджер расположения".Для различных компьютеров трудно заранее предсказать точные координаты того места, где долженнаходится элемент управления. Действительно, если бы положение элементов управления жестко задавалось в абсолютных координатах, то при запуске в Windows 95 с дисплеем 640x480 апплета, рассчитанногона X-терминал с разрешением 1280x1024, получилось бы неизвестно что.
Поэтому размещением элементовуправления в апплете занимается менеджер расположения, которому программист только указывает, как те Ляхевич А.Г., 2000 - 2002 годили иные элементы должны быть расположены по отношению к другим элементам. Точные значениякоординат вычисляет сам менеджер. Существуют пять различных типов менеджеров расположения:1) Flow Layout (последовательное расположение).
Располагает элементы последовательно слеванаправо, пока они помещаются в одном ряду. Затем переходит на следующий ряд, и так далее. Этотменеджер установлен в апплете по умолчанию.2) Grid Layout (табличное расположение). Представляет контейнер как таблицу, состоящую из клетокодинакового размера. Располагает элементы в клетках таблицы, начиная с левого верхнего угла ипродолжая вправо и вниз, подобно последовательному расположению. Различие между последовательным и табличном расположением состоит в том, что при табличном расположении четкозадается число элементов в строке (или столбце), а всем элементам отводятся клетки одинаковойформы и размера.3) Border Layout (полярное расположение).
Рассматривает апплет как лимб компаса. При добавлениинового элемента менеджеру расположения сообщается, что элемент следует поместить в одну из пятиобластей: "север" (North), "юг" (South), "запад" (West), "восток" (East) и "центр" (Center).
В каждойобласти может быть не более одного элемента. Точные координаты вычисляются, исходя изотносительных размеров элементов.4) Card Layout (блокнотное расположение). Все элементы, входящие в контейнер, рассматриваются какстранички блокнота. В каждый данный момент видна только одна из страничек.5) Grid Bag Layout (ячеистое расположение).
Наиболее универсальный менеджер расположения и в тоже время наиболее запутанный. Менеджер Grid Bag Layout разделяет контейнер на клетки равногоразмера, как и GridLayout. Отличие GridBagLayout состоит в том, что он сам определяет, сколькотребуется строк и столбцов, а также позволяет элементу занимать при необходимости более однойклетки. Область, занимаемая элементом, называется его ячейкой (display area).
Прежде чем добавитьэлемент в апплет, надо задать менеджеру GridBagLayout набор "пожеланий" насчет того, где следуетразмещать элемент. Эти пожелания выдаются в форме объекта GridBagConstraints, который имеетследующие свойства:- gridx и gridy. Координаты клетки, куда будет помещен следующий элемент (если он будетзанимать более одной клетки, это координаты левой верхней занимаемой клетки). Левый верхнийугол в объекте GridBagLayout имеет координаты (0, 0).
По умолчанию переменные gridx и gridyимеют значение GridBagConstraints.RELATIVE. Для gridx это означает клетку непосредственносправа от последнего добавленного элемента, а для gridy — клетку, примыкающую к последнемуэлементу снизу.- gridwidth и gridheight. Число клеток, которое занимает компонент по горизонтали и вертикали.По умолчанию оба эти значения равны 1. Если требуется, чтобы компонент был последним встроке, следует задать gridwidth равным GridBagConstraint.REMAINDER (тоже самое дляgridheight означало бы, что компонент является последним в столбце). Если компонент долженстоять предпоследним в строке или столбце, следует задать GridBagConstraint.RELATIVE.- fill.
Сообщает как поступить, если элемент меньше, чем предоставленная ему ячейка. По умолчанию используется значение GridBagConstraint.NONE, которое оставляет размер элемента безизменений. GridBagConstraint .HORIZONTAL заставляет растянуть элемент по горизонтали доразмеров ячейки, без изменения вертикального размера.
GridBagConstraint.VERTICAL заставляетрастянуть элемент по вертикали до размеров ячейки без изменения горизонтального размера.GridBagConstraint.BOTH указывает, что элемент следует растянуть в обоих направлениях доразмеров ячейки.- ipadx и ipady. Указывает, сколько пикселов добавить к размерам компонента по осям х и у.Добавление происходит с каждой стороны элемента, так что параметр ipadx, равный 4, приведет кувеличению размера элемента на четыре пиксела вправо и на четыре влево.
По умолчаниюиспользуется значение 0.- insets. Экземпляр класса Insets. Указывает, сколько места нужно оставить между границамиэлемента и краями ячейки. Другими словами, параметр insets создает "демаркационную линию",окружающую элемент. В примере, приведенном ниже, создается экземпляр класса Insets сотступами в 20 пикселей со всех сторон: Insets myInsets = new Insets (20,20,20,20);- anchor. Используется тогда, когда размеры элемента меньше размеров его ячейки.
Этот параметруказывает, где должен располагаться элемент в пределах ячейки. По умолчанию применяетсяGridBagConstraint.CENTER (разместить в центре), но есть еще несколько значений:GridbagConstraints.NORTH (север), GridBagConstraints.NORTHEAST (северо-восток),GridBagConstraints.EAST (восток), GridBagConstraints.SOUTHEAST (юго-восток),GridBagConstraints.SOUTH (юг), GridBagConstraints.SOUTHWEST (юго-запад),GridBagConstraints.WEST (запад), GridBagConstraints.NORTHWEST (северо-запад).- weightx и weighty.
Применяются для задания относительных размеров элементов. Например,элемент с параметром weightx, равным 2.0, занимает по горизонтали вдвое большее пространство,чем элемент с weightx, равным 1.0. Поскольку это относительные значения, неважно, имеют ли Ляхевич А.Г., 2000 - 2002 годвсе элементы значение параметров 1.0 или 3.0. Следует задать эти параметры хотя бы для одногокомпонента по каждому из направлений, так как иначе менеджер GridBagLayout сожмет всекомпоненты к центру апплета.Примеры задания менеджеров расположения:FlowLayout myManager = new FlowLayout( ); // создание менеджера типа FlowLayoutFlowLayout myManager = new FlowLayout(FlowLayout.RIGHT,10,5); /* создание менеджера FlowLayout,выравнивание по правому краю, расстояние между элементамипо горизонтали – 10 пикселей, вертикали – 5 пикселей */setLayout (myManager); // активизация менеджера myManagerGridLayout myManager = new GridLayout (0, 4); // 4 колонки для элементов, число строк - автоматическиGridLayout myManager = new GridLayout (4, 0); // 4 строки для элементов, число колонок – автоматическиGridLayout myManager = new GridLayout (4, 2); /* 4 строки для элементов, число колонок игнорируется иопределяется автоматически */GridLayout myManager = new GridLayout (4, 0, 10, 5); /* расстояние между элементами по горизонтали – 10пикселей, вертикали – 5 пикселей */setLayout (myManager); // активизация менеджера myManagerBorderLayout myManager = new BorderLayout ( ); // создание менеджера типа BorderLayoutBorderLayout myManager = new BorderLayout (10,5); /* установка менеджера BorderLayout, промежутокмежду элементами по горизонтали – 10, по вертикали – 5 пикселей.
*/Button myButton = new Button ("Нажми меня"); // создание кнопки myButtonsetLayout (myManager); // активизация менеджера myManagerthis.add(myButton, myManager.CENTER); // добавление кнопки myBtton в апплет (this), в область "Центр"GridBagLayout myManager = new GridBagLayout( ); // создание менеджера типа GridBagLayoutButton myButton = new Button("Нажми меня"); // создание кнопки myButtonsetLayout(myManager); // активизация менеджера myManagerGridBagConstraints ogranichenie = new GridBagConstraints( ); // создание объекта ограниченийogranichenie.weightx = 1.0; // описание ограниченийogranichenie.gridwidth = GridBagConstraints.RELATIVE; // описание ограниченийogranichenie.fill = GridBagConstraints.BOTH; // описание ограниченийmyManager.setConstraints(myButton, ogranichenie ); // активизация ограничений для кнопки myButtonthis.add (myButton); // добавление кнопки myButton в апплетВсе приведенные выше менеджеры расположения – это классы, описанные в пакете AWT.
Существуюттакже и другие менеджеры расположения. Например, в пакете com.borland.jbcl.layout, поставляемом вместесо средой разработки Jbilder, описан менеджер расположения XYLayout, который позволяет самостоятельнозадавать размеры и координаты элементов:import com.borland.jbcl.layout.*;// импорт пакета, содержащего менеджер расположенияXYLayout myManager = new XYLayout( ); // создание нового менеджера расположенияthis.setLayout(myManager);// активизация менеджера для апплета (this)myManager.setWidth(283); myManager.setHeight(261);// ширина и высота окна менеджераButton myButton = new Button("Knopka");// создание кнопки с надписью Knopkathis.add ( myButton, new XYConstraints (128, 191, 123, 25) ); // добавление кнопки в координаты X:Y=128:191// и с размером кнопки 123 на 25 пикселей10.2.
Элементы управления в апплете, обработка событий.Апплет может содержать различные элементы управления: кнопки (класс Button), флажки и переключатели(класс Chekbox), списки (класс List), выпадающие списки (класс Choice), надписи (класс Label), поля ввода(класс TextField), текстовые области (класс TextArea), раскрывающиеся и контекстные меню и др. элементы.Большинство из них определено в пакете AWT, однако возможно использование и других пакетов,например, javax.swing, com.borland.dbswing и др.Каждый элемент управления, и апплет в целом, имеет свой список событий, происходящих при техили иных действиях пользователя. Достаточно просто описать методы, которые будут выполняться принаступлении тех или иных событий. Примеры событий: mousePressed (кнопка мыши нажата), mouseReleased(кнопка мыши отпущена), mouseClicked (щелчок кнопкой мыши), mouseEntered (мышь вошла в границыэлемента), mouseExited (мышь вышла за пределы элемента), mouseMoved (мышь перемещается надэлементом), mouseDragged (мышь перемещается над элементом, удерживая нажатой кнопку мыши),keyPressed (клавишу нажали – можно определить какая), keyReleased (клавишу отпустили), keyTyped(обобщенное событие: клавиша нажата и отпущена), focusGained (элементом получен фокус), Ляхевич А.Г., 2000 - 2002 годfocusLost(элементом потерян фокус), actionPerformed (обобщенное событие: произошло действие надэлементом), itemStateChanged (изменилось состояние элемента – для флажков) и др.Добавление элементов управления в апплет происходит, обычно, на стадии инициализации апплета(метод Init) по следующей общей схеме:1) Создать и активизировать менеджер расположенияXYLayout myManager = new XYLayout( );this.setLayout(myManager); myManager.setWidth(283); myManager.setHeight(261);2) Создать элемент управленияButton button1 = new Button( );3) Добавить элемент управления в апплетthis.add(button1, new XYConstraints(128, 191, 123, 25));4) Описать процедуры обработки событий для элемента.//установить "прослушиватель" событий мыши для кнопки button1button1.addMouseListener(new java.awt.event.MouseAdapter() {// при нажатии кнопки мыши вызываем метод button1_mousePressedpublic void mousePressed(MouseEvent e) {button1_mousePressed(e);}// при отпускании кнопки мыши вызываем метод button1_ mouseReleasedpublic void mouseReleased(MouseEvent e){button1_mouseReleased(e);}// при щелчке кнопкой мыши вызываем метод button1_ mouseClickedpublic void mouseClicked(MouseEvent e) {button1_mouseClicked(e);}// конец "прослушивателя" событий мыши для кнопки button1});5) При возникновении событий, пользоваться свойствами и методами элемента, для манипулирования егосостоянием и получения введенной пользователем информации.// вызов этих процедур был описан на шаге 4void button1_mousePressed(MouseEvent e) {button1.setBackground(Color.red); // при нажатии на кнопку она становится красной}void button1_mouseReleased(MouseEvent e) {button1.setBackground(Color.gray); // при отпускании кнопки она становится опять серой}void button1_mouseClicked(MouseEvent e) {button1.setLabel("knopka was clicked by user"); // после щелчка на кнопке, надпись на ней изменяется}* Внимание: при описании переключателей, учитывайте следующие особенностью пакета AWT:фактически в AWT есть только флажки (квадратик с галочкой), но отсутствуют переключатели (кружокс точкой).