[an error occurred while processing this directive]

Операции Java

При обсуждении строковых классов были затронуты операции, которые можно использовать при написании программ. Аналогично типам, операции не являются какими-то методами классов, а используются традиционным способом. Отчасти, это определяется тем, что типы не являются классами. Все операции делятся на арифметические, битовые, отношения и логические.

Арифметические операции задаются следующими операторами: ОператорОперацияОператор Операция+сложение-вычитание*умножение/деление%деление по модулю+=сложение с присваиванием-=вычитание с присваиванием*=умножение с присваиванием/=деление с присваиванием%=Деление по модулю с присваиванием++инкремент--декремент

Значения этих операций такие же как и в С. Битовые операции можно представить в виде сле дующей таблицы: ОператорОперацияОператор Операция~NOT  &AND&=AND с присваиваниемOR =OR с присваиванием^XOR^=XOR с присваиванием>>сдвиг вправо>>=сдвиг вправо с присваиванием<<сдвиг влево<<=сдвиг влево с присваиванием>>>сдвиг вправо с заполнением>>>=сдвиг вправо с заполнением и присваиванием

Отношения используются при управлении потоком вычислений. Они применяются в операторах Java типа if, while и т.п. Ниже приведена таблица операторов-отношений. ОтношениеЗначениеОтношениеЗначение==равно!=не равно>больше<меньше>=больше или равно<=меньше или равно

Отношения этого типа используются с арифметическими типами и не могут быть использованы с логическими типами. Для работы с логическими типами используются логические операторы. ОператорОперацияОператорОперация&AND&=ANDc присваиваниемOR =OR с присваиванием^ХOR^=XPR с присваиваниембыстрый OR==равно&&быстрый AND!=не равно!NOT?:if-then-else

Единственным комментарием к этой таблице будет обсуждение "быстрых" операторов. Суть этих операторов в том, что значение выражения в ряде случаев определено заранее и нет смысла в его вычислении, например если один из операторов false в операции &, то значение будет равно false вне зависимости от значения второго операнда.

Управление потоком вычислений и операторы Java

Для управления потоком вычислений в Java определены операторы: if-else, break, switch, return. Оператор if-else позволяет осуществить выбор кода, который следует выполнить по условию:

if( j<0)
 {
 ...
 }
else
 {
 ...
 }

Оператор break позволяет прекращать выполнение кода в текущем блоке, а если он используется с меткой, то фактически осуществляется переход по метке.

if( I>10)
{
a: g=10;
 if(I>20)
 {
b: g=20;
 ....
 breaka;
 }
}

Для множественных переходов используется оператор switch:

switch(a)
{
 case 1:
 ...
 break;
 case 2:
 ...
 break;
 ....
 default:
 ...
 break;
}

Другой оператор, который используется при управлении потоком вычислений - это оператор return. Он возвращает управление методу, который вызвал данный метод. Код за оператором return не выполняется, если только не будет осуществлен переход по метке.

Циклы являются наиболее часто употребляемым элементом программы, т.к. практически всегда приходится применять одну и туже последовательность к массиву однотипных данных. В Java определено три типа циклов: while, do-while, for.

Цикл while выполняется до тех пор пока условие его выполнения - истина. Перед выполнением циклов необходимо провести инициализацию переменных, которые будут использоваться в цикле:

i = 0;
while(i<10)
 {
 System.out.println(i);
 i++;
 }

Цикл do-while применяется в том случае, если тело цикла надо выполнить хотя бы один раз. Во всем остальном он такой же как while.

Цикл for используется для компактной записи циклов:

for(i=0;i<10;i++)
 {
 System.out.println(i);
 }

Точно так же как и в С, здесь могут применяться оператор "," для разделения условий или других компонентов записи, а также оператор continue, который заставляет перейти в конец тела цикла.

AbstractWindowToolkit и Графика

Как уже было отмечено выше все процедуры отображения сосредоточены в методе paint апплета. Поэтому именно здесь и применяются методы отрисовки графических изображений и текста.

Для отрисовки графики используются методы объектов класса Graphics: drawRect(x,y,x1,y1)отрисовка прямоугольникаfillRect(x,y,x1,y1)отрисовка прямоугольника с заполнениемdrawOval(x,y,r1,r2)отрисовка элипсаfillOval(x,y,r1,r2)отрисовка эллипса с заполнениемdrawArc(x,y,r1,r2,a1,a2)дугаfillArc(x,y,r1,r2,a1,a2)секторdrawLine(x,y,x1,y1)линия  drawPolygon(xa,ya,np)ломаннаяfillPolygon(xa,ya,np)полигон

При использовании перечисленных выше методов можно реализовать простые гистограммы и круговые диаграммы. Для более полного освещения методов работы с графикой следует обращаться к справочным материалам по Java (напомним, что полное описание классов и методов входит в состав JavaDevelopmentKit в формате HTML).

Отрисовка графических объектов производится с использованием графического контекста (класс Graphics). Методы класса Graphics позволяют отображать большинство графических примитивов и управлять цветовой гаммой объектов.

Другим важным механизмом построения интерфейса является набор классов AWT (AbstractWindowToolkit). Идея AWT достаточно проста: построить описание основных рабочих элементов интерфейса и описать методы их размещения в рабочем окне и обработки сообщений от этих методов.

Рассмотрим применение методов работы с графикой на примере апплета, отображающего гистограмму. Высота каждой полоски гистограммы задаётся как параметр вызова апплета. Сначала приведём текст HTML файла, из которого активизируется апплет:

<HTML>
<APPLET
 CODE="demo_prm.class"
 WIDTH=500
 HEIGHT=500>
 <PARAMNAME=RectGreenValue="400">
 <PARAMNAME=RectBlue Value="10">
 <PARAMNAME=RectRed Value="500">
 <PARAMNAME=RectCyan Value="300">
</APPLET>
</HTML>

Теперь приведем и исходный текст апплета:

import java.awt.*;
import java.applet.*;
import java.lang.*;
import java.util.*;

public class demo_prm extendsApplet {

 String myGreen;
 String myBlue;
 String myRed;
 String myCyan;
 int theGreen;
 int theBlue;
 int theRed;
 int theCyan;

 public void init()
 {
 myGreen = getParameter("RectGreen");
 myBlue = getParameter("RectBlue");
 myRed = getParameter("RectRed");
 myCyan = getParameter("RectCyan");

 theGreen = newInteger(myGreen).intValue();
 theBlue = newInteger(myBlue).intValue();
 theRed = newInteger(myRed).intValue();
 theCyan = newInteger(myCyan).intValue();
 } // init

 public void paint(Graphics g)
 { g.drawLine(50, 23, 400, 23);

 g.setColor(Color.green);
 g.drawString(myGreen, 50, 20);
 g.fillRect(50, 25, 50, theGreen );

 g.setColor(Color.blue);
 g.drawString(myBlue, 150, 20);
 g.fillRect(150, 25, 50, theBlue );

 g.setColor(Color.red);
 g.drawString(myRed, 250, 20);
 g.fillRect(250, 25, 50, theRed );

 g.setColor(Color.cyan);
 g.drawString(myCyan, 350, 20);
 g.fillRect(350, 25, 50, theCyan );
 } // paint
} // demo_prm

Как видно из текста апплета, сначала (метод init) производится разбор параметров вызова с помощью метода GetParameter и сохранение полученных данных в переменных класса. Далее гистограмма отображается путём отрисовки вертикальных столбцов разных цветов (метод fillRect). Обращаем внимание, что отрисовка графических примитивов производится с использованием графического контекста (объект класса Graphics).

Следующий пример показывает отображение основных элементов AWT пользовательского интерфейса: статический текст, кнопки, выпадающее меню, поле ввода. Помимо этих объектов демонстрируется создание графических примитивов (прямоугольник, овал, окружность, текст) и управление их цветами.

import java.awt.*;
import java.applet.*;

public classmydemo extendsApplet {

 String ButtonEvent = null;
 String TextEvent = null;
 String MenuEvent = null;
 Font font;
 Choice menu = newChoice();

 /* Инициирование */
 public voidinit() {
 super.init();

 /* Меню выбора цвета фигур */
 add(newLabel("Menu: "));
 menu.addItem("Black");
 menu.addItem("Blue");
 menu.addItem("Green");
 menu.addItem("Pink");
 menu.addItem("Cyan");
 menu.addItem("Orange");
 menu.addItem("Yellow");
 menu.addItem("Magenta");
 add(menu);

 /* Поле ввода */
 add(newLabel(" Textfield:"));
 add(newTextField(25));

 /* Кнопки */
 add(newLabel(" Buttons:"));
 add(newButton("Oval"));
 add(newButton("Circle"));
 add(newButton("Rectangle"));

 font = newjava.awt.Font("TimesRoman", Font.PLAIN, 24);
 } // init


 /* Управление для меню */
 public voidHandleMenu(Choice menu) {
 MenuEvent = menu.getItem(menu.getSelectedIndex());
 repaint();
 } // HandleMenu

 /* Управление для поля ввода */
 public voidHandleText(TextFieldText) {
 TextEvent = Text.getText();
 repaint();
 } // HandleText


 /* Обработка событий */
 public booleanaction(Event event, Object object) {

 // от меню
 if(event.target instanceofChoice)
 HandleMenu((Choice)event.target);

 // от поля ввода
 if(event.target instanceofTextField)
 HandleText((TextField)event.target);

 // от кнопок
 if(event.target instanceofButton) {
 ButtonEvent = (String) object;
 repaint();
 }

 return(true);
 } // action

 /* Отрисовка */
 public voidpaint(Graphicsg) {

 if(MenuEvent != null) {
 g.setFont(font);
 if(MenuEvent == "Red")
 g.setColor(Color.red);

 if(MenuEvent == "Blue")
 g.setColor(Color.blue);

 if(MenuEvent == "Green")
 g.setColor(Color.green);

 if(MenuEvent == "Black")
 g.setColor(Color.black);

 if(MenuEvent == "Yellow")
 g.setColor(Color.yellow);

 if(MenuEvent == "Pink")
 g.setColor(Color.pink);

 if(MenuEvent == "Cyan")
 g.setColor(Color.cyan);

 if(MenuEvent == "Orange")
 g.setColor(Color.orange);

 if(MenuEvent == "Magenta")
 g.setColor(Color.magenta);

 g.drawString("Selected :" + MenuEvent, 5, 175);
 } // if

 if(TextEvent != null) {
 g.setFont(font);
 g.drawString("Entered :" + TextEvent, 5, 225);
 } // if

 if(ButtonEvent != null) {
 g.setFont(font);
 g.drawString("Button :" + ButtonEvent, 5, 275);

 if(ButtonEvent == "Oval")
 g.fillOval(525,125,225,275);

 if(ButtonEvent == "Circle")
 g.fillOval(525,125,225,225);

 if(ButtonEvent == "Rectangle")
 g.fillRect(525,125,225,225);
 } // if

 } // paint
} // demo_prm

В начале происходит создание объектов AWT, точнее объектов подклассов AWT: Button, Label, TextField и Choice.

После этого происходит размещение этих элементов при помощи метода Add. При этом используется определенный алгоритм размещения (т.н. раскладка), который задается методом setLayout (в данном примере этот метод не используется и по умолчанию действует потоковая схема размещения объектов).

Потоковое (Flow) размещение располагает все элементы интерфейса в строку друг за другом. Существует размещение в виде таблицы (Grid, GridBag) или в виде расположения объектов по границам окна (BorderLayout). Помимо этого, элементы интерфейса могут быть размещены по относительным координатам апплета (метод move).

Все события в нашем апплете обрабатываются методом action, который является стандартным для любого апплета.

Для удобства создания интерфейса могут быть использованы классы Panel и Frame. Эти классы представляют собой простейшие контейнеры, которые могут включать в себя различные объекты пользовательского интерфейса и располагать их по заданной раскладке (метод setLayout). Каждый из этих классов может включать несколько объектов класса Panel. Класс Frame отличается от Panel тем, что реализован в виде окна, в то время, как объект класса Panel встраивается непосредственно в другие панели и окна.

В целом, следует отметить, что программирование интерфейса на Java без использования средств визуальной разработки интерфейса по сложности сравнимо с программированием вручную графических приложений для Windows.

Назад | Содержание | Вперед

  [an error occurred while processing this directive]