Программирование. Программирование на Java Конспект лекций (ИТМО 2010). Справочник по языку Java и может использоваться как конспект лекционного курса Системы программирования Интернетприложений
Скачать 0.85 Mb.
|
79 Hello stub = (Hello) registry.lookup("Hello"); 2. Вызов удаленного метода String response = stub.sayHello(); System.out.println(response); Запуск каталога, сервера и клиентов Для UNIX/Linux: rmiregistry & java -classpath path \ -Djava.rmi.server.codebase=file:path/ Server & java -classpath path Client Для Windows: start rmiregistry start java -classpath path -Djava.rmi.server.codebase=file:path/ Server java -classpath path Client 80 Графический интерфейс пользователя В Java существует две реализации графического пользовательского интерфейса — java.awt и j avax.swing. AWT — Abstract Window Toolkit java.awt - набор классов-оберток компонентов GUI операционной системы, на которой выполняется Java-приложение. Компоненты AWT реализованы платформозависимым способом на каждой реализации java машины. При этом для пользователя существует иерархия оберток, обладающих разной реализацией графического представления на разных архитектурах. Структура пакета java.awt приведена на рис. 9. Компоненты Компонент ( java.awt.Component ) — базовый класс, определяющий отображение на экране и поведение каждого элемента интерфейса при взаимодействии с пользователем. Задает размер, цвет, отступы, область отображения и порождает основные события. Класс лежат в основе иерархии. Для компонентов можно установить множество разных атрибутов, таких как цвет, шрифт и множество других. Например, для установки цвета фона и переднего плана используются следующие методы: setBackground(Color); // установка цвета фона компонент setForeground(Color); // установка цвета на переднем плане // (например, надпись на кнопке) Для определения цвета используется класс java.awt.Color , в котором цвет можно задать либо при помощи таблицы RGB, либо при помощи переменных класса. Для установки шрифта используется метод setFont(Font) Все надписи, принадлежащие данному компоненту будут написаны эти шрифтом. Для определения шрифта используется класс java.awt.Font , в котором шрифт определяется через 3 параметра: имя (Helvetica), стиль его написания (BOLD) и высота (12). 81 ImageObserver java.io.Seralizable java.lang.Object Component Container Button Button Canvas Canvas Checkbox Checkbox Choice Choice Label Label List List ScrollBar ScrollBar TextComponent TextComponent Window Window Panel Panel ScrollPane ScrollPane Dialog Dialog Frame Frame FileDialog FileDialog Image TextArea TextArea TextField TextField Рисунок 9. Структура пакета java.awt Возможность включать изображения в программу реализуется через потомков абстрактного класса Image 82 java.lang.Object MenuComponent MenuBar MenuBar MenuItem MenuItem CheckboxMenuItem CheckboxMenuItem Menu Menu PopupMenu PopupMenu Кнопка (Button) Внешний вид компонента приведён на рис. 10. Рисунок 10. Кнопка Button b = new Button ("New Button"); Простейший компонент пользовательского интерфейса, применяемый практически во всех приложениях. Для создания нового компонента необходимо создать объект этого класса, в приведенном примере в качестве аргумента передается строка-заголовок. При создании новой кнопки можно использовать конструктор без аргументов. Переключатели (Checkbox) Внешний вид компонента приведён на рис. 11. Рисунок 11. Переключатели Checkbox ch = new Checkbox ("One", true); Данный компонент позволяет визуально устанавливать значения on или off для переменной. При использовании нескольких переключателей, несколько переменных могут принимать значение on При создании нового объекта необходимо задать как строку название, так и его значение. Необходимо помнить о том, что при использовании в качестве параметра объекта типа CheckboxGroup по крайней мере хотя бы один CheckBox должен быть в состоянии on Группы переключателей (CheckboxGroup) Внешний вид компонента приведён на рис. 12. 83 Рисунок 12. Группа переключателей CheckboxGroup cbg = new CheckboxGroup(); add(new Checkbox("yellow", cbg, false)); add(new Checkbox("green", cbg, true)); add(new Checkbox("blue", cbg, false)); add(new Checkbox("red", cbg, false)); Для использования этого компонента необходимо наличие n-числа переключателей. Алгоритм создания группы переключателей следующий: инициализация нового объекта типа CheckboxGroup и добавление к нему переключателей при помощи метода add() Списки (List) Списком называется набор элементов, один или несколько из которых могут быть выбраны из создаваемого окна с прокруткой. Для создания списка необходимо: • инициализация объекта типа List (в конструкторе задаем число видимых строк и аттрибут, определяющий возможен ли выбор нескольких строк одновременно); • добавление строк методом add() Рисунок 13. Группа переключателей Возможно использование пустого конструктора. Примеры списков с использованием одиночного и множественного выбора представлены на рис. 13. List lst = new List (4, false); lst.add("Mercury"); lst.add("Venus"); lst.add("Earth"); lst.add("JavaSoft"); lst.add("Mars"); 84 lst.add("Jupiter"); lst.add("Saturn"); lst.add("Uranus"); lst.add("Neptune"); lst.add("Pluto"); lst.setMultipleMode (true); Метод setMultipleMode(boolean) определяет возможность выбора множества строк. Выпадающие списки (Choice) Choice ColorChooser = new Choice(); ColorChooser.add("Green"); ColorChooser.add("Red"); ColorChooser.add("Blue"); Рисунок 14. Выпадающие списки Данный компонент (рис. 14)создается аналогично обычному списку, только при его использовании можно всегда выбирать только одну строку. В данном классе используется только один пустой конструктор, который и создает объект этого класса, для полноценной работы которого необходимо добавление n-числа строк, что реализуется при помощи метода add() Полоса прокрутки (Scrollbar) Scrollbar sb = new Scrollbar(Scrollbar.VERTICAL, 0, 1, 0, 255); Рисунок 15. Полоса прокрутки Как правило, полоса (рис. 15) автоматически добавляется к полю редактирования, но их можно использовать и самостоятельно, как отдельные элементы интерфейса. При создании нового объекта можно задать следующие параметры: • тип - вертикальная или горизонтальная; • начальное значение (положение); 85 • размер скроллера; • минимальное значение; • максимальное значение. Надписи (Label) Label l = new Label ("This is new Label", Label.CENTER); l.setText ("This is Label"); l.setAlignment (Label.LEFT) Рисунок 16. Надпись Данный компонент (рис. 16) позволяет размещать статические текстовые надписи. При создании объекта можно использовать пустой конструктор, но тогда саму надпись необходимо задавать при помощи метода setText(String) В приведенном примере задается строка надписи и тип выравнивания ( LEFT, RIGHT, CENTER ), последнее можно задать при помощи метода setAlignment(int) Холст (Canvas) Данный класс предоставляет возможность выводить на экран изображения, а также при помощи графических примитивов создавать собственные. Делается это при использовании методов класса Graphics и метода paint() Текстовые Компоненты (TextComponent) Рисунок 17. Текстовые компоненты TextField tf = new TextField (); tf.setText ("This is TextField"); tf.setColumn (10); TextArea ta = new TextArea ("This is new TextArea", 10, 10, TextArea. SCROLLBARS_BOTH); 86 Их можно разделить на два основных элемента (рис. 17) - строковое поле ( TextField ), текстовое поле ( TextArea ). Их отличие состоит в следующем: в текстовом поле может содержаться n-число строк и k-число столбцов, а строковое одну строку и k-число столбцов. Методы для этих полей сходны, только для строкового поля их меньше. Для создании объекта типа TextArea возможно использование 5 конструкторов, рассмотрим один из них, который требует наибольшее количество параметров: • строковая переменная, определяющая содержимое текстового поля; • целочисленная переменная, определяющая количество строк в поле; • целочисленная переменная, определяющая количество столбцов в поле; • целочисленная переменная, определяющая тип визуализации горизонтальных и вертикальних полос прокрутки. • В приведенном примере создается объект с заданным текстом, количество строк и столбцов равно 10 и с наличием вертикальных и горизонтальных полос прокрутки. Контейнеры Контейнер ( java.awt.Container ) - компонент, способный содержать в себе другие компоненты, и управлять их размещением и, возможно, размерами при помощи менеджеров компоновки. Панель (Panel) Работа с данным компонентом не отличается от работы с другими компонентами класса java.awt , за единственным исключением, что для панели можно установить менеджер компоновки (см. далее) при помощи метода setLayout() Добавление компонентов осуществляется методом add() В отличии от других компонентов панель не прорисовывается, то есть не имеет внешнего вида. Panel p1 = new Panel (); p1.setLayout (new FlowLayout ()); p1.add (new Button ("Button1")); p1.add (new TextField (10)); p1.add (new Label ("This is FlowLayout")); 87 Скроллирующие панели (ScrollPane) Рисунок 18. ScrollPane Контейнер ScrollPane (рис. 18) отображает ограниченный участок дочернего элемента и снабжен горизонтальными и вертикальными полосами прокрутки для его просмотра в окне просмотра. Использование ScrollPane просто. Необходимо его создать и добавить дочерний элемент. ScrollPane отличается от обычного контейнера следующим: • он поддерживает лишь один дочерний элемент (как правило, используется панель со множеством компонент); • не предусмотрено использование менеджера компоновки • необходимо задавать размеры с помощью метода setSize() Окно приложения (Frame) Frame — контейнер, формирующий окна приложения с заголовком окна. Недоступен в апплетах. Фрейм позволяет добавлять к себе меню и обрабатывать события интерфейса пользователя, связанные с активированием, сворачиванием и закрытием окна. Менеджеры компоновки Менеджер компоновки является незаменимым инструментом при использовании в апплете более одного компонента. Пакет java.awt включает следующие менеджеры: • FlowLayout - менеджер, используемый по умолчанию, размещает компоненты последовательно в строку. Его использование оправдано в том случае, когда Вы знаете точные размеры компонент. • BorderLayout — создает так называемое полярное расположение: разбивает панель на 5 зон (South, North, Center, West, East). Он учитывает разницу в размерах отдельных компонентов и пытается максимально использовать пространство контейнеров. • GridLayout - создает решетку, состоящую из прямоугольников одинакового размера, в каждом из которых располагается один компонент. 88 • CardLayout - предназначен для последовательной визуализации различных панелей на одной основный. • GridBagLayout - данный менеджер является наиболее сложным. Он позволят реализовывать сложный интерфейс, в котором контейнер содержит много компонентов различных размеров, которые должны находиться в одном и том же заданном положении относительно других. В приведенном ниже примере рассматриваются все описанные выше компоненты. import java.awt.*; public class SimpleComponents extends java.applet.Applet { public void init () { Panel p1 = new Panel (); Panel p2 = new Panel (); p1.setLayout (new FlowLayout ()); p1.add (new Button ("Button1")); p1.add (new TextField (10)); p1.add (new Label ("This is FlowLayout")); p2.setLayout (new GridLayout (3, 1, 0, 0)); p2.add (new TextArea ("This is GridLayout", 10, 5)); Choice ColorChooser = new Choice(); ColorChooser.add("Green"); ColorChooser.add("Red"); ColorChooser.add("Blue"); p2.add (ColorChooser); List lst = new List(4, false); lst.add("Mercury"); lst.add("Venus"); lst.add("Earth"); lst.add("JavaSoft"); lst.add("Mars"); lst.add("Jupiter"); lst.add("Saturn"); lst.add("Uranus"); lst.add("Neptune"); lst.add("Pluto"); lst.setMultipleMode (true); p2.add(lst); setLayout (new BorderLayout ()); add ("South", p1); add ("Center", p2); } } 89 Меню (Menu) Меню - компонент пользовательского интерфейса, позволяющий создавать в приложениях главное меню. Меню в java.awt неразрывно связано с содержащим ее фреймом. Процесс подсоединения меню к приложению (рис. 19) состоит из нескольких частей: • создание строки меню MenuBar mb = new MenuBar(); • создание нового меню на строку меню Menu m = new Menu("File"); • добавление опции в меню и присваивание ей имени m.add(new MenuItem ("Load") • Добавление меню к фрейму Frame f = new Frame("окно"); f.setMenuBar(mb); Рисунок 19. Создание меню Пример использования Меню import java.awt.*; public class SimpleMenu extends Frame { MenuBar mb; Menu file, edit, exit, help, subhelp; MenuItem fload, fsave, fnew, ecopy, epaste, ecut, habout, hdetails; CheckboxMenuItem eview; public SimpleMenu () { mb = new MenuBar (); 90 setMenuBar (mb); file = new Menu ("File", true);edit = new Menu ("Edit"); exit = new Menu ("Exit");help = new Menu ("Help"); fload = new MenuItem ("Load"); fsave = new MenuItem ("Save"); fnew = new MenuItem ("New"); file.add (fload); file.add (fsave); file.add (fnew); ecopy = new MenuItem ("Copy"); epaste = new MenuItem ("Paste"); ecut = new MenuItem ("Cut"); eview = new CheckboxMenuItem ("View"); edit.add (ecopy); edit.add (epaste); edit.add (eview); subhelp = new Menu ("Sub Help Menu"); habout = new MenuItem ("About"); hdetails = new MenuItem ("Details"); mb.setHelpMenu (help); help.add (subhelp); subhelp.add (habout); subhelp.add (hdetails); mb.add (file); mb.add (edit); mb.add (exit); mb.add (help); setSize (200, 300); } public static void main (String args []) { SimpleMenu sm = new SimpleMenu (); sm.pack (); sm.setVisible (true); } } 91 Модель обработки событий Компоненты AWT генерируют события в соответствии с воздействиями пользователя на графический интерфейс. Другие компоненты регистрируются для прослушивания этих событий и реагируют соответствующим образом. Существует 4 составные части модели обработки событий. • Компонент-источник события • Компоненты-слушатели или приемники события • Интерфейс слушателя • Класс события Источник события Источником события является компонент, генерирующий событие и регистрирующий заинтересованные в прослушивании данного события компоненты. К примеру, реализация источника события нажатия на кнопку для класса Button могла бы быть выполнена следующим образом: public class Button extends Component { private String label = null; // надпись на кнопке private Vector listeners = new Vector(); //слушатели события public synchronized void addActonListener(ActonListener l) { listeners.addElement (l); // Регистрация слушателя } public synchronized void removeBeginListener(ActonListener l) { listeners.removeElement (l); // Удаления слушателя } //оповещение слушателей (например, при щелчке мышки на кнопке) protected void notifyActon () { Vector copy; //создание события; ActionEvent h = new ActionEvent(this,0,label); synchronized (this) {copy = (Vector)listeners.clone();} for (int i=0;i } 92 } } Источник события оповещает слушателя путем вызова специального полиморфного метода интерфейса слушателя ( actionPerformed ) и передачи ему объекта события ( ActionEvent ). Все слушатели событий определенного события должны реализовывать соответствующий интерфейс. Внимание! Реальная реализация Button в AWT использует более эффективный код, использующий java.awt.AWTEventMulticaster Интерфейс слушателя Интерфейс слушателя — вспомогательный интерфейс, который обязаны реализовывать все слушатели события для возможности добавления себя в список у источника события. package java.awt.event; public interface ActionListener extends EventListener { public void actionPerformed(ActionEvent e); } Иинтерфейс определяет методы (здесь actionPerformed ), которые будут вызваны в момент доставки события слушателю. Все интерфейсы слушателей являются расширением класса java.util.EventListener . По установленному соглашению, методам слушателей может быть передан один единственный аргумент, который соответствует данному слушателю. Слушатель события Слушатель события — компонент, регистрирующийся для прослушивания события у источника и реагирующий на него. Слушатель может события обрабатывать внутри собственного класса: public class MyFrame extends Frame implements ActionListener { Button b = new Button("New"); // кнопка источник-события public MyFrame () { b.addActionListener(this); //регистрация у источника } // реализация интерфейса слушателя public void actionPerformed(ActionEvent e) { System.out.println("Button "+b+" was pressed"); 93 } } Слушатель может использовать неименованные (анонимные) классы для прослушивания события. Это упрощает код слушателя и позволяет реализовать в одном классе много слушателей однотипных событий: // кнопка источник-события и регистрация у источника Button b = new Button("New"); b.addActionListener(new ActionListener(){ // реализация интерфейса слушателя public void actionPerformed(ActionEvent e) { System.out.println("Button "+e.getActionCommand()+ " was pressed"); } }); Здесь происходит неявное реализация интерфейса ActionListener новым, анонимным классом, с единственным методом actionPerformed Событие Событие пользовательского интерфейса — потомок класса java.awt.AWTEvent , предназначенный для передачи информации от источника события к слушателю. События пакета AWT вместе со слушателями находятся в пакете java.awt.event В событии должна содержаться вся информация, необходимая программе для формирования реакции на данное событие. В нашем примере это аттрибут actionCommand package java.awt.event; public class ActionEvent extends AWTEvent { String actionCommand; public ActionEvent(Object source,int id,String command) { super(source, id); this.actionCommand = command; } public String getActionCommand() { return actionCommand;} } |