import java.awt.*;
import java.applet.*;
public class ScrollbarDemo extends Applet {
public void init() {
setLayout(null);
int width = Integer.parseInt(getParameter(“width”));
int height = Integer. parseInt(getParameter(“height"));
Scrollbar hs = new Scrollbar(Scrollbar.HORIZONTAL, 50, width / 10, 0,100);
Scrollbar vs = new Scrollbar(Scrollbar.VERTICAL, 50, height / 2,0,100);
add(hs);
add(vs);
int thickness =16;
hs.reshape(0, height - thickness, width - thickness, thickness);
vs.reshape(width - thickness, 0, thickness, height - thickness);
}
}
12.11. Класс TextField
Класс TextField представляет собой реализацию однострочной области для ввода текста. Такие области часто используются в формах для пользовательского ввода. Вы можете «заморозить» содержимое объекта TextField с помощью метода setEditable, а метод isEditable сообщит вам, можно ли редактировать текст в данном объекте. Текущее значение объекта можно получить методом getText и установить методом setText. С помощью метода select можно выбрать фрагмент строки, задавая его начало и конец, отсчитываемые с нуля. Для выбора всей строки используется метод selectAll.
Метод setEchoChar задает символ, который будет выводиться вместо любых вводимых символов. Вы можете проверить, находится ли объект TextField в этом режиме, с помощью метода echoCharlsSet и узнать, какой именно символ задан для эхо-печати, с помощью метода getEchoChar. Вот пример, в котором создаются классические поля для имени пользователя и пароля.
import java.awt.*;
import java.applet.*;
public class TextFieldDemo extends Applet {
public void init() {
setLayout(null);
int width = Integer.parseInt(getParameter("width"));
int height = Integer.parseInt(getParameter(“height"));
Label namep = new Label("Name : ", Label.RIGHT);
Label passp = new Label("Password :”, Label.RIGHT);
TextField name = new Text Field(8);
TextField pass = new TextField(8);
pass.setEchoChar('*');
add(namep);
add(name);
add(passp);
add(pass);
int space = 25;
int wl = width / 3;
namep.setBounds(0, (height - space) / 2, wl, space);
name.setBounds(wl, (height - space) / 2, wl, space);
passp.setBounds(0, (height + space) / 2, wl, space);
pass.setBounds(wl, (height + space) / 2, wl, space);
}
}
12.12. Класс TextArea
Порой одной строки текста оказывается недостаточно для конкретной задачи. AWT включает в себя очень простой многострочный редактор обычного текста, называемый TextArea. Конструктор класса TextArea воспринимает значение типа String в качестве начального текста объекта. Кроме того, в конструкторе указывается число колонок и строк текста, которые нужно выводить. Есть три метода, которые позволяют программе модифицировать содержимое объекта TextArea: appendText добавляет параметр типа String в конец буфера; insertText вставляет строку в заданное отсчитываемым от нуля индексом место в буфере; replaceText копирует строку-параметр в буфер, замещая ею текст, хранящийся в буфере между первым и вторым параметрами-смещениями. Ниже приведена программа, создающая объект TextArea и вставляющая в него строку.
import java.awt.*;
import java.applet.*;
public class TextAreaDemo extends Applet {
public void init() {
setLayout(null);
int width = Integer.parseInt(getParameter(“width"));
int height = Integer.parseInt(getParameter("height"));
String val = "Хочешь быть великим - " + "стань им.n" +
"Только в началеn" + "победи сам себяn" +
"и в первую очередьn" + "свою лень.nn";
TextArea text = new TextArea(val, 80,40); add(text);
text.setBounds(0,0, width, height);
}
}
12.13. Стратегии размещения компонентов
Все компоненты, с которыми мы работали до сих пор в этой главе, размещались «вручную». И в каждом примере мы вызывали загадочный метод setLayout(null). Этот вызов запрещал использование предусмотренного по умолчанию механизма управления размещением компонентов. Для решения подобных задач в AWT предусмотрены диспетчеры размещения (layout managers).
12.13.1. Диспетчер размещения LayoutManager
Каждый класс, реализующий интерфейс LayoutManager, следит за списком компонентов, которые хранятся с именами типа String. Всякий раз, когда вы добавляете компонент в Panel, диспетчер размещения уведомляется об этом. Если требуется изменить размер объекта Panel, то идет обращение к диспетчеру посредством методов minimumLayoutSize и preferredLayoutSize. В каждом компоненте, который приходится обрабатывать диспетчеру, должны присутствовать реализации методов preferredSize и minimumSize. Эти методы должны возвращать предпочтительный и минимальный размеры для прорисовки компонента, соответственно. Диспетчер размещения по возможности будет пытаться удовлетворить эти запросы, в то же время заботясь о целостности всей картины взаимного расположения компонентов.
В Java есть несколько предопределенных классов — диспетчеров размещения, описываемых ниже.
12.13.2. Стратегия FIowLayout
Класс FIowLayout реализует простой стиль размещения, при котором компоненты располагаются, начиная с левого верхнего угла, слева направо и сверху вниз. Если в данную строку не помещается очередной компонент, он располагается в левой позиции новой строки. Справа, слева, сверху и снизу компоненты отделяются друг от друга небольшими промежутками. Ширину этого промежутка можно задать в конструкторе FIowLayout. Каждая строка с компонентами выравнивается по левому или правому краю, либо центрируется в зависимости от того, какая из констант LEFT, RIGHT или CENTER была передана конструктору. Режим выравнивания по умолчанию — CENTER, используемая по умолчанию ширина промежутка — 5 пикселей. Ниже приведен пример, в котором в Panel включается несколько компонентов Label. Объект Panel использует FIowLayout с выравниванием RIGHT.
import java.awt.*;
import j ava. applet. *;
import java.util.*;
public class FlowLayoutDemo extends Applet {
public void init() {
setLayout(new FlowLayout(FlowLayout.RIGHT, 10,3));
int width = Integer.parseInt(getParanieter(,,width"));
int height = Integer.parseInt(getParameter("height"));
String val = "Разложим это предложение по словам";
StringTokenizer st = new StringTokenizer(val);
while (st.hasMoreTokens()) {
add(new Button(st.nextToken()));
}
}
}
12.13.3. Стратегия BorderLayout
Класс BorderLayout реализует обычный стиль размещения для окон верхнего уровня, в котором предусмотрено четыре узких компонента фиксированной ширины по краям и одна большая область в центре, которая может расширяться и сужаться в двух направлениях, занимая все свободное пространство окна. У каждой из этих областей есть строки-имена: String.North, String. South, String.East и String.West соответствуют четырем краям, a Center — центральной области. Ниже приведен пример BorderLayout с компонентом в каждой из названных областей.
import java.awt.*;
import j ava.applet. *;
import java.util.*;
public class BorderLayoutDemo extends Applet
{
public void init() {
setLayout(new BorderLayout());
int width = Integer.parseInt(getParameter("width"));
int height = Integer.parseInt(getParameter("height"));
add("North", new Button("Вверху"));
add(" South", new Label("Внизу"));
add("East", new Button("Слева"));
add("West", new Button ("Справа"));
String msg = "Пример показывает " +
"как компоненты размещаютсяn" +
"по сторонам света.nn";
add("Center", new TextArea(msg));
}}
12.13.4. Стратегия GridLayout
Класс GridLayout размещает компоненты в простой равномерной сетке. Конструктор этого класса позволяет задавать количество строк и столбцов. Ниже приведен пример, в котором GridLayout используется для создания сетки 4x4, 15 квадратов из 16 заполняются кнопками, помеченными соответствующими индексами. Как вы уже, наверное, поняли, это панель для игры в «пятнашки».
import j ava.awt. *;
import java.applet. *;
public class GridLayoutDemo extends Applet {
static final int n = 4;
public void init()
{
setLayout(new GridLayout(n, n));
setFont(new Font("Helvetica", Font.BOLD, 24));
int width = Integer.parseInt(getParameter("width"));
int height = Integer.parseInt(getParameter("height"));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
intk = i * n + j;
if (k > 0)
add(new Button("" + k));
}
}
}
12.14. Программирование окон - Window
Класс Window во многом напоминает Panel за тем исключением, что он создает свое собственное окно верхнего уровня. В основном используется не непосредственно класс Window, а его подкласс Frame. Frame — это как раз то, что обычно и считают окном на рабочей поверхности экрана. У объекта Frame есть строка с заголовком, управляющие элементы для изменения размера и линейка меню. Для того чтобы вывести (спрятать) изображение объекта Frame, нужно использовать методы show и hide. Ниже приведен пример апплета, который показывает объект Frame с содержащимся в нем компонентом TextArea.
import java.awt. *;
import java.applet.*;
public class FrameDemo extends Applet {
public void init() {
int width = lnteger.parseInt(getParameter("width"));
int height = Integer.parseInt(getParameter("height"));
String val = "Это учебное пособие " + "предназначено для ознакомленияn"