Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
|
import j a v a .a w t .*; import j a v a .a w t .event.*; import java.applet.*; /* */ public class FlowLayoutDemo extends Applet implements ItemListener { String msg = ""; Checkbox winXP, win7 , solaris, mac; public void in i t () { // Задаем компоновку с выравниванием влево setLayout(new FlowLayout(FlowLayout.LEFT)); winXP = new Checkbox("Windows X P " , null, true); win7 = new Checkbox("Windows 7"); solaris = new Checkbox("Solaris"); mac = new Checkbox("Mac OS"); add(winXP); add(win7); add(solaris); Глава 25. Использование элементов управления, диспетчеров компоновки. 8 0 7 add(mac); // Регистрирация на получение уведомлений о событиях) ; w i n 7 .addltemListener(this); solaris.addltemListener(this); m a c .addltemListener(this); } // Перерисовываем в случае изменения состояния флажка public void itemStateChanged(ItemEvent ie) { repaint(); } // Отображаем текущее состояние флажков public void paint(Graphics g) { msg // msg "Current state: Текущее состояние .drawString(msg, 6 msg = " Windows XP: g .drawString(msg, 6 msg = " Windows 7: g.drawString(msg, 6 msg = " Solaris: " g .drawString(msg, 6 msg = 1 1 Mac: " + m a c . getState () g .drawString(msg, 6, 160); 80) ; + w i n X P .getState(); 100) ; + w i n 7 .getState(); 1 2 0 ) ; solaris.getState(); 140) ; } Аплет F lo w L ay o u t Demo вовремя выполнения показан на рис. 25.10. Сравните его с результатом, который был получен при выполнении аплета C heckboxD em o см. рис. 25.3). A p p le t V ie w e r: F low l ... « ||□ Applet W indow sXP R iW in d o w ijj V Solaris Г Mac OS Current state W indow sXP true Windows 7: true Solaris, false Mac: false Applet Рис. 25.10. Окно аплета FlowLayoutDemo 8 0 Часть II. Библиотека Класс B o r d e r L a y o u Этот класс реализует общий стиль компоновки для окон переднего плана. Он имеет четыре узких компонента с фиксированной шириной по краями одну большую область в центре. Четыре стороны именуют по сторонам света север, юг, запад и восток. Область посредине именуется центром. Ниже показаны конструкторы, определяемые классом B o r d e r L a y o u t. BorderLayout() BorderLayout(int гори з int верт) Первый вариант создает компоновку границы по умолчанию. Второй вариант устанавливает горизонтальный и вертикальный промежутки между компонентами при помощи параметров гори з и верт. Класс B o r d e r L a y o u t определяет следующие константы, с помощью которых указываются области o r d e r L a y o u t .CENTER B o r d e r L a y o u t .SOUTH B o r d e r L a y o u t При добавлении компонентов выбудете использовать эти константы в следующей форме метода a d d ( ), который определяется в классе C o n t a i n e r . void add(Component объектУпр , Object регион) Здесь параметр объектУпр представляет добавляемый компонента параметр регион указывает, где будет добавлен компонент. Ниже показан пример объекта класса B o r d e r L a y o u t с компонентом в каждой области размещения Демонстрация применения BorderLayout. import java.awt.*; import java.applet.*; import java.util.*; /* */ public class BorderLayoutDemo extends Applet { public void in i t () { setLayout(new BorderLayout()); add(new Кнопка вверху, BorderLayout.NORTH); add(new L a b e l (Сюда можно поместить сообщение нижнего колонтитула BorderLayout.SOUTH); add(new Справа, BorderLayout.EAST); add(new Слева, BorderLayout.WEST); String msg = "The reasonable man adapts " + "himself to the world;\n" + "the unreasonable one persists in " + "trying to adapt the world to himself.\n" + "Therefore all progress depends " + "on the unreasonable man.\n\n" + " - George Bernard Shaw\n\n"; add(new TextArea(msg), BorderLayout.CENTER); } } Аплет BorderLayoutDemo вовремя выполнения показан на рис. Глава 25. Использование элементов управления, диспетчеров компоновки. 8 0 9 A p p le t V ie w e r: B o rd e rL a y o u tD e m o ; у This is across the top._______ The reasonable man adapts him self to the world; the unreasonable one persists in trying to adapt the wo Therefore all progress depends on the unreasonable n - George Bernard Shaw _____ J<_' The footer m essage might go here Applet Рис. 25.11. Окно аплета Использование класса Иногда нужно, чтобы между контейнером, в котором содержатся ваши компоненты, и окном, где он находится, оставался небольшой промежуток. Для этого необходимо переопределить метод get Insets () , определяемый классом Container. Эта функция возвращает объект класса Insets, который содержит верхнюю, нижнюю, левую и правую вставки (inset), используемые при отображении объекта. Эти значения диспетчер компоновки применяет для вставки компонентов вовремя компоновки окна. Ниже показан конструктор класса Insets. Insets(int сверху слева снизу сп рава) Значения, передаваемые в параметрах сверху, слева, снизу испр а в а , определяют промежуток между контейнером и окном, в котором он заключен. Метод getlnsets () имеет следующую общую форму При переопределении одного из этих методов следует вернуть новый объект класса Insets, который будет содержать требуемую промежуточную вставку. Ниже показан измененный вариант предыдущего примера применения диспетчера класса BorderLayout. Здесь компоненты расставляются с отступом в десять пикселей. Для фона был выбран голубой цвет, чтобы можно было отличить вставки Демонстрация применения BorderLayout и вставок import j a v a .a w t .*; import java.applet.*; import java.util.*; /* */ 8 1 Часть II. Библиотека Java public class InsetsDemo extends Applet { public void init() { // задаем цвет фона, чтобы без труда различать вставки setBackground(Color.cyan); setLayout(new BorderLayout()); add(new Button("This is across the top."), B o r d e r L a y o u t . N O R T H ) ; // add(new Кнопка вверху BorderLayout.NORTH)V add(new Label("The footer message might go here."), // add(new L a b e l (Сюда можно поместить сообщение нижнего колонтитула BorderLayout.SOUTH); add(new B u tton("Right"), BorderLayout.EAST); add(new Button("Left"), BorderLayout.WEST); String msg = "The reasonable man adapts " + "himself to the world;\n" + "the unreasonable one persists in " + "trying to adapt the world to himself.\n" + "Therefore all progress depends " + "on the unreasonable man.\n\n" + " - George Bernard Shaw\n\n"; add(new TextArea(msg), BorderLayout.CENTER); } // добавляем вставки public Insets getlnsetsO { return new Insets(10, 10, 10, 10); } Аплет InsetsDemo вовремя выполнения показан на рис. 25.12. , tb* ^ К 4 4 ИЛ o ^ ^ ^ f ^ Applet The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the Therefore all progress depends on the unreasonab - George Bernard Ш Ша Ш ге . r ; ■ * «■ •- '' S * * Applet Рис. 25.12. Окно аплета InsetsDemo Глава 25. Использование элементов управления, диспетчеров компоновки. 8 1 Класс G r i d L a y o u При использовании класса G r i d L a y o u t компоненты размещаются в двухмерной сетке. Когда вы реализуете класс G r i d L a y o u t , определяете количество строки столбцов. Ниже показаны конструкторы, поддерживаемые классом G r i d L a y o u t . GridLayout() G r i d L a y o u t (int колСтрок , int колКолонок) GridLayout(int колСтрок , int колК олонок, int гори з , int верт} Первый вариант создает сеточную компоновку с одним столбцом. Второй вариант порождает сеточную компоновку с заданным количеством строки столбцов. Третья форма позволяет определить горизонтальный и вертикальный промежутки между компонентами при помощи параметров гориз и верт. Один из параметров колСтрок и колКолонок может принимать нулевое значение. Если параметру колСтрок присвоить нулевое значение, то столбцы не будут иметь ограничения по длине. Если нулевое значение присвоить параметру колКолонок , строки не будут иметь ограничения по длине. Ниже показан пример программы, которая создает сетку 4x4 и заполняет ее 15 кнопками, каждая из которых обозначается своим индексом Демонстрация применения GridLayout import j a v a .a w t .*; import java.applet.*; /* */ public class GridLayoutDemo extends Applet { static final int n = 4; public void init() { setLayout(new GridLayout(n, n ) ); setFont(new F o n t ("S a n s S e r i f ", Font.BOLD, 24)); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { int k = i * n + j ; i f (k > 0) add(new Button("" + k ) ); } } } } Аплет G r i d l a y o u t D e m o вовремя выполнения показан на рис. Совет. Этот пример можно взять за основу для написания программы игры в “пятнадцать”. Класс C a r d L a y o u Уникальным среди остальных диспетчеров компоновки является класс CardLayout, поскольку он хранит несколько различных компоновок. Каждую компоновку можно представить в виде отдельной карточки из картотеки эти карточки можно перетасовывать как угодно, ив любой момент вначале картотеки будет находиться какая-нибудь карточка. Такой вариант может быть полезен для пользовательских интерфейсов с необязательными компонентами, которые 8 1 Часть II. Библиотека можно динамически включать и отключать в зависимости от вводимых пользователем данных. Вы Можете подготовить другие схемы компоновки и сделать их скрытыми, готовыми к активизации в случае необходимости, n ; w . v A ' Applet tV ie w e r : G r i dLayoutDemo| Applet 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ■Applet Рис. Окно а пл е та G r i d l a y o u t D e m Класс CardLayout предлагает следующие два конструктора a r d L a y o u t () C a r d L a y o u t (int гори з , int в ер т Первый вариант создает карточную компоновку по умолчанию. Второй вариант позволяет указать горизонтальный и вертикальный промежутки между компонентами при помощи параметров гори з и верт. Использование карточной компоновки требует большего объема работы, чем другие схемы компоновки. Карточки обычно хранятся в объекте класса Panel. Для этой панели необходимо выбрать диспетчер компоновки класса CardLayout. Карточки, образующие картотеку, обычно тоже являются объектами класса Panel. Следовательно, понадобится создать панель, которая будет содержать картотеку, и панель для каждой карточки из этой картотеки. Затем нужно добавить в соответствующую панель компоненты, формирующие каждую карточку. После этого нужно добавить данную панель на главную панель аплета. Когда это будет сделано, необходимо будет подумать о том, как пользователь сможет производить свой выбор в картотеке. При добавлении карточки на панель ей обычно присваивается имя. Поэтому в большинстве случаев будете использовать следующую форму метода add ( ) для добавления карточек на панель add(Component об ъ е к тП ан ели имя) Здесь параметр имя представляет имя карточки, панель которой определяется при помощи параметра объектП анели. После того как создадите картотеку, программа будет активизировать карточку с помощью одного из следующих методов, определяемых классом CardLayout. v oi d first(Container панель панель панель Глава 25. Использование элементов управления, диспетчеров компоновки. 8 1 3 voi d previous ( C o n t a i n e r панель панель имя Карточки Здесь параметр панель представляет ссылку на контейнер (обычно панель, который хранит карточки, а параметр имяКарточки — имя карточки. В результате вызова метода f irst () будет отображена первая карточка в картотеке. Чтобы показать последнюю карточку, вызовите метод last () . Для отображения следующей карточки вызовите метод next () . Чтобы показать предыдущую карточку, вызовите метод previous (). Методы next () и previous () автоматически циклически переходят по картотеке вверх или вниз соответственно. Метод show () отображает карточку, имя которой передается в параметре имяКарточки. В следующем коде создается двухуровневая картотека, в которой пользователь может выбрать операционную систему. Операционные системы семейства Windows отображаются на одной карточке, операционные системы Mac OS и Solaris — на другой Демонстрация применения t. e ve n t. * ; import j a v a . a p p le t .* ; /* */ public class C a rdLayoutDemo extends Applet implements A ctio nListener, MouseListener { Checkbox winXP, w i n 7 , solaris, mac; Panel osCards; CardLayout cardLO; Button Win, Other; public void init() { Wi n = n e w B u t t o n (" W i n d o w s "); Other = ne w B u t t o n ("O t h e r "); a d d ( W i n ) ; a d d ( O t h e r ) ; cardLO = ne w C a r d L a y o u t (); osCards = ne w P a n e l (); o s C a r d s .s e t L a y o u t ( c a r d L O ) ; // присваиваем компоновке карточки компоновку панели winXP = ne w C h e c k b o x ("Windows X P " , null, true); win7 = n e w C h e c k b o x ("Windows 7"); solaris = ne w C h e c k b o x ("S o l a r i s "); mac = n e w C h e c k b o x ("Mac OS"); // добавляем на панель флажки Windows Panel w inPan = ne w P a n e l (); w i n P a n . a d d ( w i n X P ) ; w i n P a n .a d d ( w i n 7 ); // добавляем на панель флажки других ОС Panel otherPan = ne w P a n e l (); o t h e r P a n .a d d (s o l a r i s ); o t h e r P a n .a d d ( m a c ); // добавляем панели в карточную панель o s C a r d s .a d d ( w i n P a n , "Win d o w s "); 8 1 Часть II. Библиотека Java o s C a r d s .a d d (o t h e r P a n , "O t h e r "); // добавляем карточки в главную панель аплета a d d ( o s C a r d s ) ; // регистрация на получение уведомлений о событиях W i n . a d d A c t i o n L i s t e n e r ( t h i s ); O t h e r . a d d A c t i o n L i s t e n e r ( t h i s ) ; // регистрируем событиям ыши a d d M o u s e L i s t e n e r ( t h i s ) ; } // Циклический перебор панелей public void m o u s e P r e s s ed(MouseEvent me) { c a r d L O . n e x t ( o s C a r d s ) ; } // Создаем пустые заготовки для остальных методов M o u s e L i s t e n e r . public v oid m o u s e C l i c k ed(MouseEvent me) { } public v o i d m o u s e E n t ered(MouseEvent me) { } public v o i d m o u s e E x i t e d(MouseEvent me) { } public v o i d m o u s e R e leased(MouseEvent me) { } public void a c t i onPerformed(ActionEvent ae) { i f ( a e .g e t S o u r c e () == Win) { c a r d L O . s h o w ( o s C a r d s , "Windows"); } else { c a r d L O .s h o w (o s C a r d s , "O t h e r "На рис. 25.14 показан аплет CardLayoutDemo вовремя выполнения. Каждая карточка активизируется после щелчка на ее кнопке. Щелкая кнопкой мыши, можно циклически переходить от одной карточки к другой. Класс G r i d B a g L a y o u Хотя предыдущие схемы компоновки отлично подходят для использования во многих аплетах, для некоторых из них все же необходим подробный контроль расположения компонентов в окне. Для этого удобно применять сеточную компоновку (grid bag), которая определена в классе GridBagLayout. Компоновка “grid bag” обладает полезным свойством, которое позволяет задавать относительное расположение компонентов, указывая их позиции в ячейках сетки. Ключевой особенностью компоновки “grid bag” является то, что каждый компонент может иметь свои размеры, а каждая строка в сетке — свое количество столбцов. Этими объясняется название этой схемы компоновки — grid bag (“сетка-мешок”). Это — коллекция небольших соединенных вместе сеток. Местонахождение и размеры каждого компонента в сеточной компоновке определяются набором связанных с ним ограничений, которые содержатся в объекте класса GridBagConstraints. Ограничения включают высоту и ширину ячейки, расположение компонента, его выравнивание и точку связывания внутри ячейки Глава 25. Использование элементов управления, диспетчеров компоновки. |