Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
|
TRACK Произошло событие абсолютного перемещения UNIT_DECREMENT Нажата кнопка перевода страницы на одну строку вниз UNIT_INCREMENT Нажата кнопка перевода страницы на одну строку вверх Следующий код создает вертикальную и горизонтальную полосы прокрутки. Отображаются текущие настройки полос прокрутки. При перемещении курсора мыши в окне координаты каждого события перемещения будут использоваться для обновления полос прокрутки. Звездочка отображается в текущей позиции при перетаскивании. Обратите внимание на то, как метод s e t P r e f e r r e d S i z e () позволяет устанавливать размер полос прокрутки Демонстрация применения полос прокрутки import java.awt.*; import java.awt.event.*; import java.applet.*; /* */ public class SBDemo extends Applet implements AdjustmentListener, MouseMotionListener { String msg = ""; Scrollbar vertSB, horzSB; public void ini t () { int width = Integer.parselnt(getParameter("width")); int height = Integer.parselnt(getParameter("height")); vertSB = new Scrollbar(Scrollbar.VERTICAL, 0, 1, 0, height); vertSB.setPreferredSize(new Dimension(20, 100)); horzSB = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, width); horzSB.setPreferredSize(new Dimension(100, 20)); add(vertSB); add(horzSB); // регистрация на получение уведомлений о событиях vertSB.addAdjustmentListener(this); horzSB.addAdjustmentListener(this); addMouseMotionListener(this) ; } 8 0 Часть II. Библиотека Java public void adjustmentValueChanged(AdjustmentEvent ae) { repaint(); } // Обновление полос прокрутки в ответ на перетаскивание // с помощью мыши void mouseDragged(MouseEvent me) { int x = m e .g e t X (); int у = m e .g e t Y (); vertSB.setValue(y); horzSB.setValue(x); repaint(); // Это нужно для MouseMotionListener public void mouseMoved(MouseEvent me) { } // Отображение текущего значения полос прокрутки public void paint(Graphics g) { msg = "Vertical: " + vertSB.getValue(); // msg = "Вертикальная " + vertSB.getValue(); msg += ", Horizontal: " + horzSB.getValue(); // msg +- ", Горизонтальная " + horzSB.getValue(); g .drawString(msg, 6, 160); // показываем текущую позицию при перетаскивании с помощью g .drawString("*", horzSB.getValue(), vertSB.getValue()); } } Аплет SBDemo вовремя выполнения показан на рис. 25.7. НЯ ftpptet Vertical: 117, Horizontal. 152 Applet Рис. 25.7. Окно аплета SBDemo Глава 25. Использование элементов управления, диспетчеров компоновки. 8 Использование класса Класс TextField реализует однострочную область для ввода текста, которая называется текстовым полем В текстовых полях пользователь может вводить строки и редактировать текст. Класс TextField является подклассом класса TextComponent и определяет следующие конструкторы) throws HeadlessException TextField(int количСимволов) throws HeadlessException TextField(String строка throws HeadlessException TextField(String строка int количСимволов) throws Первый вариант создает текстовое поле. Второй — текстовое поле, ширина которого в символах определяется параметром количС им во лов. Третий вариант конструктора инициализирует текстовое поле и устанавливает его ширину. Класс TextField и его суперкласс TextComponent предлагают несколько методов, с помощью которых можно работать с текстовым полем. Чтобы узнать, какая строка содержится на данный момент в текстовом поле, вызовите метод getText (). Чтобы настроить текст, вызовите метод setText () . Эти методы показаны ниже getText() void setText(String строка) Здесь параметр строка определяет новую строку. Пользователь может выделить часть текста в текстовом поле. Часть текста также можно выделить программно с помощью метода select () . При помощи метода get Select edText () программа сможет узнать, какой текст выделен в данный момент. Упомянутые методы показаны ниже getSelectedText() void select(int начИндекс, int конИндекс) Метод getSelectedText () возвращает выделенный текст. Метод select () выделяет символы, начиная со значения начИ ндекс и заканчивая значением к он Индекс -С помощью метода set Edit able () пользователю можно разрешить изменять содержимое текстового поля, ас помощью метода isEditable () — редактировать текст. Эти методы показаны ниже isEditableO void setEditable(boolean правкаВозможна) Метод isEdi table () возвращает значение true, если текст можно изменять, и значение false — если текст изменять нельзя. Если в методе setEditable () параметр правкаВозмож на содержит значение true, то текст можно изменять, а если значение false — текст изменять нельзя. Иногда нужно сделать так, чтобы текст, вводимый пользователем, был невидим в частности, при вводе пароля. С помощью метода setEchoChar () можно отключить отображение вводимых символов. Этот метод задает одиночный символ, который объект класса TextField будет отображать при вводе символов (и, следовательно, реальные символы отображаться не будут. С помощью метода getEchoChar () можно узнать, включен ли этот режим для текстового поля. Получить символ отображения можно с помощью метода getEchoChar () . Эти методы показаны ниже setEchoChar(char символ) boolean echoCharlsSet() char Здесь параметр символ определяет отображаемый символ. Если значением параметра символ будет нуль, то восстанавливается нормальное отображение на экране Зак 3030 8 0 Часть II. Библиотека Обработка текстовых полей Поскольку текстовые поля выполняют собственные функции редактирования, ваша программа вообще не будет реагировать на события отдельных клавиш, происходящие в текстовом поле. Однако вам, возможно, нужно будет сделать так, чтобы пользователь мог нажимать клавишу Ниже показан пример, в котором создается классический экран для ввода имени пользователя и пароля Демонстрация применения текстового поля import j a v a .a w t .*; import j a v a .a w t .event.*; import java.applet.*; /* */ public class TextFieldDemo extends Applet implements ActionListener { TextField name, pass; public void init() { Label namep = new Label("Name: ", Label.RIGHT); // Label namep = new L a b e l (Имя ", Label.RIGHT); Label passp = new La b e l ("Password: ", Label.RIGHT); // Label passp = new La b e l (Пароль, Label.RIGHT); name = new TextField(12); pass = new TextField(8); p a s s .setEchoChar('?'); add(namep); a d d (name); add(passp); add(pass); // регистрация на получение уведомлений о событиях действия name.addActionListener(this); p a s s .addActionListener(this); } // Пользователь нажал public void actionPerformed(ActionEvent ae) { repaint(); } public void paint(Graphics g) { g .drawstring("Name: " + n a m e .getText(), 6, 60); g .drawString("Selected text in name: " + n a m e .getSelectedText(), 6, 80); g.drawString("Password: " + p a s s .getText(), 6, 100); // g Имя " + n a m e .getText(), 6, 60); // g Выделенный текст в имени " + // n a m e .getSelectedText(), 6, 80); // g Пароль " + p a s s .getText(), 6, 100); } } Аплет T e x t F i e l d D e m o вовремя выполнения показан на рис. 25.8. Глава 25. Использование элементов управления, диспетчеров компоновки. 8 0 3 . , f bfc ъ % J - ^ ^ Y ^ ^ ф г ^ ,4, * j* > ; f IfA p p le t V ie w e r:T e x tF ie ld D e m o | Applet | Nam e: 1 Herb Ш 1 Ш, j '?*?????'?'??? 4 юямммшвпи Name: Herb Schildt Selected text in nam e Schildt Password' Idfkjslkdf Applet Рис. 25.8. Окно аплета Использование класса T e x t A r e Иногда одной строки для ввода текста недостаточно. На этот случай библиотека AWT предлагает простой многострочный редактор — класс TextArea. Ниже показаны конструкторы этого класса) throws HeadlessException TextArea(int количСтрок, int количСимволов) throws HeadlessException TextArea(String строка throws HeadlessException TextArea(String строка количСтрок, int количСимволов) throws HeadlessException TextArea(String строка int количСтрок, int количСимволов, int пПрокрутки) throws Здесь параметр количСтрок определяет высоту текстовой области, измеряемой в строках, а параметр количС им волов задает ее ширину, измеряемую в символах. Исходный текст можно определить при помощи параметра строка. В пятом варианте можно создать полосы прокрутки, которые могут понадобиться для работы с этой областью. Параметр пПрокрутки должен принимать одно из следующих значений. SCROLLBARS_BOTH SCROLLBARS_NONE SCROLLBARS_HORIZONTAL_ONLY SCROLLBARS_VERTICAL_ONLY Класс TextArea является подклассом класса Text Component. Следовательно, он поддерживает методы getText (), setText (), getSelectedText (), se lect ( ), isEditable () и setEditable ( ), описанные в предыдущем разделе. Класс TextArea включает следующие дополнительные методы append(String строка insert(String строка int индекс replaceRange(String строка int начИндекс, int конИндекс) Метод append () добавляет строку, определяемую при помощи параметра строка, вконец текущего текста. Метод insert () вставляет строку, указанную параметром строка, вместо, определенное индексом. Чтобы заменить текст, вызовите метод replaceRange (). Он заменяет символы, начиная с индекса, указанного в параметре нач Индекс, и заканчивая индексом, указанным в параметре кон Индекс на текст, передаваемый в параметре строка 8 0 Часть II. Библиотека Текстовые области являются практически автономными элементами управления. Вашей программе не грозят издержки, связанные с управлением областями текста. Обычно программа просто получает текущий текст, если в этом есть необходимость. Однако, при желании, вы можете прослушивать события класса T e x t E v e n t. В следующей программе создается элемент управления класса T e x t A re a . // Демонстрация применения TextArea, import j a v a .a w t .*; import ja v a .applet.*; /* */ public class TextAreaDemo extends Applet { public void ini t () { String val = "Java 7 is the latest version of the most\n" + "widely-used computer language for Internet programming.\n" + "Building on a rich heritage, Java has advanced both\n" + "the art and science of computer language design.\n\n" + "One of the reasons for Java's ongoing success is its\n" + "constant, steady rate of evolution. Java has never stood\n" + "still. Instead, Java has consistently adapted to the\n" + "rapidly changing landscape of the networked world.\n" + "Moreover, Java has often led the way, charting the\n" + "course for others to follow."; TextArea text = new TextArea(val, 10, 30); dd(text); Аплет T ex tA reaD em o вовремя выполнения показан на рис. 25.9. 11 Applet Viewer: TextAreaDemo | - || П || X | Applet [Java 7 is the latest version of the m o s l| widely-used computer language for In [ Building on a rich heritage, Java has a f the art and science of computer (angu I One of the reasons for Java's ongoing 1 constant, steady rate of evolution Java I still Instead, Java has consistently ad j rapidly changing landscape of the neft Moreover, Java has often led the wav, «1 S ' Applet Рис. 25.9. Окно аплета TextAreaDemo Глава 25. Использование элементов управления, диспетчеров компоновки. 8 0 Диспетчеры компоновки Каждый рассмотренный до настоящего времени компонент позиционировался диспетчером компоновки, используемым по умолчанию. Как было замечено вначале этой главы, диспетчер компоновки автоматически размещает ваши элементы управления внутри окна с применением некоторого алгоритма. Если вам приходилось писать программы для других сред с графическим пользовательским интерфейсом (например, для Windows), то вы, возможно, привыкли размещать свои средства управления вручную. Хотя элементы управления, созданные с помощью Java, тоже можно размещать вручную, вы вряд ли этим будете заниматься. На это есть две главные причины. Во-первых, размещать вручную большое количество компонентов очень утомительно. Во-вторых, в тот момент, когда нужно расположить какой-нибудь элемент управления, вы можете не знать о том, какую он имеет высоту и ширину, поскольку на этот момент еще не будут готовы собственные компоненты инструментария. Эта ситуация подобна загадке о происхождении курицы и яйца — трудно понять, когда можно использовать размеры данного компонента для его позиционирования относительно другого компонента. У каждого объекта класса Container имеется свой диспетчер компоновки, который представляет собой экземпляр любого класса, реализующего интерфейс LayoutManager. Диспетчер компоновки устанавливается при помощи метода setLayout (). Если вызов метода setLayout () не осуществляется, используется диспетчер компоновки, принятый по умолчанию. Всякий раз при изменении размеров контейнера (или при начальном определении размеров) диспетчер компоновки используется для позиционирования каждого компонента внутри контейнера. Метод setLayout () имеет следующую общую форму setLayout(LayoutManager объектКомпоновки) Здесь параметр объектКомпоновки представляет ссылку на требуемый диспетчер компоновки. Если вы хотите отменить использование диспетчера компоновки и позиционировать компоненты вручную, присвойте параметру объектКомпоновки значение null. Если вы сделаете это, вам нужно будет определить форму и позицию каждого компонента вручную с помощью метода set Bounds () , определенного в классе Component. Обычно выбудете работать с диспетчером компоновки. Каждый диспетчер компоновки следит за списком компонентов, хранящихся под своими именами. Диспетчер компоновки получает уведомление каждый раз, когда вы добавляете компонент в контейнер. Всякий раз, когда нужно изменить размеры контейнера, диспетчер компоновки использует для этого свои методы m i n i m u m L a y o u t S i z e () и p r e f e r r e d L a y o u t S i z e (). Каждый компонент, который находится под управлением диспетчера компоновки, содержит методы g e t - P r e f e r r e d S i z e () и g e t Mi n i m um S iz e (). Они возвращают предпочтительный и минимальный размеры, которые необходимы для отображения каждого компонента. Диспетчер компоновки будет учитывать их, если это вообще будет возможно, и поддерживать непротиворечивую политику размещения. Можно переопределить эти методы для элементов управления, для которых вы создаете подклассы. Иначе будут применяться значения по умолчанию имеет несколько предварительно определенных классов диспетчеров компоновки, часть из которых будет описана далее. Вы можете использовать такой диспетчер компоновки, который наилучшим образом подходит для вашего приложения. Класс F l o w L a y o u Диспетчер компоновки класса FlowLayout используется поумолчанию. Именно этот диспетчер компоновки применялся в предыдущих примерах. Диспетчер клас 8 0 Часть II. Библиотека Java са FlowLayout реализует простой стиль компоновки, который подобен тому, как следуют друг за другом слова в текстовом редакторе. Направление размещения определяется свойством ориентации компонента контейнера, которое по умолчанию задает направление слева направо и сверху вниз. Поэтому по умолчанию компоненты размещаются построчно, начиная с левого верхнего угла. В любом случае, если строка больше не может уместить компонент, он появится в следующей строке. Между каждым компонентом остается небольшой промежуток сверху и снизу, атак же справа и слева. Ниже показаны конструкторы класса FlowLayout. FlowLayout() FlowLayout(int как как int гори з , int верт) Первый вариант размещает элементы по схеме, принятой по умолчанию, — компоненты размещаются по центру, а между ними остается промежуток, равный пяти пикселям. Второй вариант позволяет определить способ расположения каждой строки. Ниже представлены допустимые значения параметра как. • FlowLayout.LEFT • FlowLayout.CENTER • FlowLayout.RIGHT • FlowLayout.LEADING • FlowLayout.TRAILING Эти значения определяют выравнивание полевому краю, по центру, по правому краю, переднему и заднему соответственно. Третий конструктор позволяет определить промежутки по горизонтали и вертикали между компонентами при помощи параметров гори з и верт. Ниже показан вариант уже знакомого вам аплета CheckboxDemo, измененного таким образом, что в нем используется последовательное размещение с выравниванием влево Компоновка с выравниванием влево |