Реферат Курсовая Конспект
Введение в Java - раздел Программирование, Введение В Java ...
|
Введение в Java
Операторы ветвления
Операторов ветвления в Java два - if и switch. Первый позволяет пойти программе по одному из двух направлений, второй позволяет сделать выбор между большим числом вариантов (два, три, четыре, ...).
Вот пример программы, которая выводит результат деления одного числа на другое. Если знаменатель равен нулю, то деления не происходит.
int a=30, b=5;
System.out.println("a="+a);
System.out.println("b="+b);
if (b!=0)
{
System.out.println(a/b);
}
else
{
System.out.println("На ноль делить нельзя!!!!");
}
Веточка else не обязательна. Если после проверки условия должен выполниться только один оператор, то фигурные скобки писать не обязательно.
Теперь пример с оператором switch. Пример смотрит, что за символ хранится в переменной ch (+, -, * или /), и в зависимости от этого делает то или иное действие с двумя числами. Результат действия выводится на экран.
char ch='/';
int k=40, n=10;
switch(ch)
{
case '+':
System.out.println(k+n);
break;
case '-':
System.out.println(k-n);
break;
case '*':
System.out.println(k*n);
break;
case '/':
System.out.println(k/n);
break;
default:
System.out.println("Error!");
}
Обратите внимание на break. Без него выполнялись бы операторы и в следующем case (пока не встретится break). Например, если написать так:
...
case 1:
case 2:
//Некоторые операторы
...
то "Некоторые операторы" будут выполнятся и когда проверяемая переменная в switch'е равна 1, и когда она равна 2.
Ветка default будет выполняться тогда, когда переменная в switch'е не равна ни одному значению в case'ах. Ее использование не обязательно. Если по задаче она не нужно, то не пишите ее.
Операторы циклов
Циклов в Java три вида - while, do-while и for. Первые два следует использовать тогда, когда точно неизвестно, сколько раз цикл должен выполнится. Цикл for используем тогда, когда число, которое наш код должен повторяться, известно.
Вот пример на цикл while:
int n=46;
int k=0;
while (k*k<=n)
{
k++;
}
В этом примере ищется такое минимальное k, что его квадрат больше n.
Цикл while и его брат цикл do-while выполняются до тех пор, пока условие в круглых скобочках истинно. Как только оно становится равным false, выполнение цикла прекращается.
Пример цикла do-while:
double k;
do
{
k=Math.random();
}while(k>0.1);
System.out.println(k);
В этом примере ищется первое случайное число меньшее 0.1. Как только оно сгенерировано датчиком случайных чисел Math.random(), выполнение цикла прекращается. Math.random() выдает случайные числа от 0 до 1.
Основное отличие циклов while и do-while в том, что while может вообще ни разу не выполнится (если условие в круглых скобочках сразу false), а do-while выполнится по крайней мере 1 раз.
Заметьте, что для циклов while и do-while где-то внутри цикла обязательно должна меняться переменная, стоящая в круглых скобочках после while. Иначе цикл может стать бесконечным.
И, наконец, пример цикла for:
for (int i=0; i<10; i++)
{
System.out.println(i*i);
}
Этот цикл распечатает квадраты целых чисел от 0 до 9. Обратите внимание, что переменная i объявлена прямо внутри цикла. Так часто и делается, так как чаще всего переменная-счетчик цикла вне его не нужна и не используется.
Начинаем изучать классы
С классом мы уже столкнулись ранее. И это не случайно - без классов на Java нельзя обойтись даже в самой простой программе. На этом же занятии и на нескольких следующих мы с вами и будем изучать классы и все, что с ними связано - наследование, конструкторы, виртуальные функции и другие мудреные вещи.
Давайте создадим новую программу. Вот ее текст:
class worker
{
private int Age;
public String Name;
public void setAge(int newAge)
{
if(newAge>=0)
Age=newAge;
else
Age=0;
}
public int getAge()
{
return Age;
}
}
class Test{
public static void main(String [] args){
worker wrk=new worker();
wrk.setAge(23);
wrk.Name="Ivan";
System.out.println(wrk.getAge() + "n" + wrk.Name);
}
}
Сохраните эту программу в файле Test.java и откомпилируйте. При запуске наша программа должны выдать две строчки: 23 и Ivan.
Что мы в нашей программе делаем? Сначала мы определяем класс worker. Делается это с помощью ключевого слова class:
class worker
{
...
}
В классе мы определяем две переменные - Age для возраста и Name для имени. Кроме типа переменных (int и String) мы используем еще модификаторы доступа - private (означает, что наша переменная не будет видна снаружи класса) и public (с наружи класса доступ есть). Раз переменную Age мы объявили как private, то пишем два метода в нашем классе: setAge для чтения возраста и getAge - для записи. Эти методы мы объявляем с модификатором public, это значит, что мы сможем их вызывать снаружи класса. Метод getAge просто возвращает наш возраст, а метод setAge делает небольшую проверку, и записывает в Age только положительный возраст или нуль в противном случае. Если вы раньше программировали на C++, то обратите внимание, во-первых, что модификаторы доступа ставятся перед каждой переменной и перед каждым методом и во-вторых, что после закрывающей фигурной скобки класса точку с запятой ставить не надо.
Класс Test служит для испытания класса worker. В нем мы заводим экземпляр нашего класса:
...
worker wrk=new worker();
Это мы делаем за два этапа - сначала заводим переменную типа worker (которая является ссылкой на объект), и затем определяем сам объект (с помощью оператора new).
После создания объекта мы можем вызывать его методы, обращаться к открытым переменным и т. п. Это мы и делаем в строчках
...
wrk.setAge(23);
wrk.Name="Ivan";
System.out.println(wrk.getAge() + "n" + wrk.Name);
...
Наследование классов
Классы можно писать не с нуля, а взяв за основу существующий класс. В этом случае эти классы будут является потомком и предком друг для друга. Потомка еще называют подклассом (subclass), а предка - суперклассом (superclass). Еще одна пара названий для таких классов - это класс-потомок и класс-предок.
Если один класс есть потомок другого, то он автоматически умеет делать все то, что умеет делать класс-предок. И нам остается только добавить в него то, чего не было в предке или изменить те методы, работа которых в классе-предке нас не удовлетворяет. В этом одна из главных черт Объектно-ориентированного программирования - если у некоторых объектов есть много общего, то можно для них создать класс-предок, в который записать все общие черты. Отличительные же черты будут реализованы в классах-потомках.
Давайте создадим класс boss, который будет потомком для класса worker из программы выше. Вот текст, который введите с том же файле Test.java, в котором находится класс worker:
class worker
{
...
}
class boss extends worker
{
public int NumOfWorkers; //Количество подчиненных
}
Ключевое слово extends означает, что наш новый класс boss есть потомок класса worker. Мы добавили в него только переменную NumOfWorkers, в которой будет храниться количество подчиненных. Класс же Test измените следующим образом:
...
public static void main(String [] args){
boss bigBoss=new boss();
bigBoss.setAge(41);
bigBoss.Name="Ivan Ivanov";
bigBoss.NumOfWorkers=100;
System.out.println(bigBoss.NumOfWorkers + "n" + bigBoss.Name);
...
Как вы видите, кроме количества подчиненных для нашего bigBoss мы можем задавать имя и возраст. Они берутся из родительского класса. Все работает, как и ожидалось.
Конструкторы классов
Конструкторы предназначены для задания некоторых стандартных значений для переменных-членов класса. Конструктор - это тот же метод класса, только обладающий некоторым количеством особенностей. Раз это метод, значит мы должны после его имени писать круглые скобки, в которых мы можем писать или не писать параметры и т. п. Но есть и несколько черт, отличающих конструктор от других методов класса. Вот они:
Конструктор всегда называется так же, как и класс (т. е. если класс, скажем, называется worker, то и контруктор будет называться worker).
Конструктор в отличие от других методов вызывается сам в момент создания экземпляра класса.
Конструктор не возвращает никакого значения. Это значит, что если перед любым другим методом мы пишем тип возвращаемого значения (int, float и т. п.), то перед конструктором ничего писать не надо (void тоже писать не надо).
Приведем пример конструкторов для класса worker:
class worker
{
private int Age;
public String Name;
//Конструктор без параметров
public worker()
{
Age=20;
}
//Конструктор с параметрами
public worker(int newAge, String newName)
{
Age=newAge;
Name=newName;
}
...
}
Посмотреть на действия конструкторов в тестовом классе можно так:
...
worker wrk1=new worker();
worker wrk2=new worker(40, "Petrov");
System.out.println(wrk1.getAge() + "n" + wrk1.Name);
System.out.println(wrk2.getAge() + "n" + wrk2.Name);
Для первого работника вызовется конструктор без параметров и его возраст установится в 20, для второго - конструктор с параметрами, и его возраст станет равным 40, а имя - Petrov
Если вы не заведете в классе конструктора, то компилятор java создаст его сам.
worker wrk=new worker();
Здесь worker() - это как раз вызов конструктора без параметров. Создаваемый по умолчанию конструктор ничего не делает.
Статические члены класса
Переменные, которые вы объявляете внутри класса, относятся к определенному экземпляру класса. Например, у класса worker, который мы рассматривали ранее, есть переменная Age (возраст). Понятно, что у одного работника возраст один, а у другого - другой, и эти два возраста между собой никак не связаны. С другой стороны, иногда нам нужна общая переменная на все экземпляры класса. Например, это может быть счетчик количества экземпляров класса. В этом случае такую переменную надо объявить с модификатором static. Вот пример:
class someclass
{
//Счетчик
static public int number;
//Конструктор
public someclass()
{
number++; //Увеличиваем счетчик
}
}
class Test{
public static void main(String [] args){
//Создаем два экземпляра класса someclass
someclass z1=new someclass();
someclass z2=new someclass();
System.out.println(someclass.number + "n");
}
}
Как вы видите, переменная number объявлена как static. Это означает, что она одна на все экземпляры. В конструкторе она увеличивается на 1. Т. е. для первого экземпляра класса она будет равна 1, для второго - 2 и т. д. Что мы и проверяем в классе Test - заводим два экземпляра класса someclass, а затем выводим значение number. Естественно, что number будет равно 2. Обратите внимание, что в строке
...
System.out.println(someclass.number + "n");
переменную number мы извлекаем не из конкретного экземплярра класса (z1, z2), а из самого класса someclass. Это возможно именно потому, что переменная number - статическая. Но, в принципе, в этом месте мы могли бы использовать и конкретный экземпляр класса - результат был бы тот же самый.
Библиотека классов Java - обзор
Классы Java объединяются в пакеты. В число основных пакетов Java входят следующие:
java.awt - классы и интерфейсы для создания пользовательского интерфейса
java.applet - классы для создания java-апплетов
java.io - классы для ввода-вывода (в том числе с консолью и файлами)
java.net - классы и интерфейсы для работы с сетью
java.math - классы для различных математических операций ()
java.lang - содержит наиболее общие для java классы и интерфейсы
java.util - пакет различных полезных классов (случайные числа, списки, даты и др.)
java.beans - пакет для создания компонентов JavaBeans
java.sql - пакет классов и интерфейсов для работы с базами данных
java.secuirity - пакет классов и интерфейсов для обеспечения безопасности
Сериализация класса
Для того, чтобы экземпляр класса можно было сохранять (например в файл) и потом восстанавливать (например, из файла), класс должен быть сериализуемым. В этом случае сохранение / чтение экземпляра класса будет происходить не поэлементно (что тоже возможно), а целиком.
Вообще же говоря, сериализация - это представление некого объекта в последовательной форме, а десериализация - это восстановление объекта из последовательной формы.
Для того, чтобы класс стал сериализуемым, его надо просто объявить потомком интерфейса Serializable. Методов в этом интерфейсе нет.
Вот сразу пример сериализуемого класса:
import java.io.*;
public class Worker implements Serializable {
// Данные класса.
int age=0;
int yoe=0;
Worker(int age, int yoe){
this.age = age;
this.yoe = yoe;
}
// Метод main.
public static void main(String[] args)
throws IOException, ClassNotFoundException {
// Сериализация экземпляра класса.
Worker w = new Worker(22, 2);
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream("1.txt"));
os.writeObject(w);
os.close();
// Десериализация экземпляра класса.
Worker w1 = new Worker(0, 0);
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("1.txt"));
w1 = (Worker)ois.readObject();
ois.close();
System.out.println("age = " + w1.age + ", yoe = " + w1.yoe);
}
}
Статический метод main, по идее, должен был бы быть в отдельном классе. Мы поместили его в этот же класс для упрощения. В этом методе мы сериализуем в файл 1.txt экземпляр нашего класса (со значениями полей 22 и 2) и потом десериализуем данные из этого файла в другой экземпляр этого же класса Worker. Результат будет вполне ожидаемым - значения полей в новом экземпляре класса будут такие же - 22 и 2.
Класс File
Класс File предназначен для работы с файлом как с отдельным объектом. Этот класс не предназначен для работы с содержимым файла. Этот класс расположен в пространстве имен java.io.
Вот пример его использования:
import java.io.*;
public class Test {
public static void main(String[] args) throws InterruptedException, IOException {
File file = new File("C:\tmp.txt");
// Проверяем существование файла.
exsists(file);
// Создаем новый файл.
file.createNewFile();
// Проверяем существование файла.
exsists(file);
// Переименование файла.
file.renameTo(new File("C:\tmp2.txt"));
// Время последней модификации.
System.out.println("Last modified: " + file.lastModified());
// Имя файла.
System.out.println("Name: " + file.getName());
// Путь к файлу.
System.out.println("Parent: " + file.getParent());
// Удаление файла.
file.delete();
// Получеие разделителя.
System.out.println("Separator: " + File.separator);
// Создание временного файла.
System.out.println("Roots: " + File.createTempFile("AAA","ZZ"));
}
private static void exsists(File file) {
if(file.exists()){
System.out.println("File exists.");
}
else{
System.out.println("File doesn't exist");
}
}
}
Обратите внимание на несколько моментов. Метод renameTo предназначенный для переименования файла, должен принимать в качестве параметра (т. е. нового файла) файл, расположенный в той же папке, что и первоначальный файл (в этом случае этот метод возвращает true, в противном случае - false). Второе: при указании полного имени файла надо вместо одного слеша () указывать два (\).
У класса File существует небольшое число статических методов. В нашем примере их рассматривается два - для получения разделителя в именах файлов (для Windows это "") и для создания временного файла. Последний метод возвращает полный путь к созданному файлу (что-то типа "C:DOCUME~1AdminLOCALS~1TempAAA46533ZZ").
АППЛЕТЫ
Информация в строке состояния браузера
Апплет может показывать информацию в строке браузера. Делается это через метод showStatus:
import java.applet.*;import java.awt.*;public class FirstApplet extends Applet{ public void paint(Graphics g){ showStatus("First Applet"); }}Параметр метода showStatus выведется в строке состояния браузера:
Класс Color
Класс Color относится к пакету java.awt.
Переменная типа Color задает цвет в формате RGB (расшифровывается как Red, Gree, Blue - красный, зеленый, синий) - каждая цветовая составляющая может принимать значения от 0 до 255.
Для создания переменной типа Color можно использовать множество конструкторов. Мы рассмотрим три из них:
Color color1=new Color(255, 255, 0); Color color2=new Color((float)0.2, (float)0.9, (float)0); Color color3=new Color(0xFFFF00);Первый конструктор задает три составляющие цвета числами от 0 (отсутствие цвета) до 255 (самый интенсивный цвет), второй - тоже самое, только интенсивность каждого цвета может задаваться вещественным числом от 0 до 1, третий конструктор задает все три цвета в одним числом (которое удобнее всего задавать в шестнадцатеричном виде, что мы и сделали).
Кроме того в классе Color определены константы для стандартных цветов. Эти константы относятся ко всему классу, а не к конкретному экземпляру. Вот пример их использования:
Color color=Color.blue;Таких констант не слишком много, но основные цвета часто удобнее задавать ими. Вот все эти константы:
Класс MouseEvent
В предыдущих уроках мы рассматривали работу с мышкой. Напомним, что для этого мы объявляли класс нашего апплета потомком интерфейсов MouseListener и MouseMotionListener. Во всех методах интерфейсов, которые мы должны были реализовать для нашего апплета, присутствовал параметр типа MouseEvent. Рассмотрим этот класс более подробно.
Указанный класс позволяет получить такие данные, как координаты мыши (x и y), нажатую кнопку мыши (левая, правая или средняя), была ли нажата одна из трех клавиш-модификаторов на клавиатуре - Ctrl, Alt или Shift.
Вот пример реализации метода mouseClicked интерфейса MouseListener:
public void mouseClicked(MouseEvent e){ if(e.getButton()==MouseEvent.BUTTON1){ x=e.getX(); y=e.getY(); repaint(); } }В этом примере мы определяем, что за кнопка мыши была нажата, используя при этом метод getButton() и статическую константу BUTTON1 класса MouseEvent (для остальных кнопок мыши константы будут BUTTON2 и BUTTON3 соответственно). Если нажата левая кнопка мыши, то мы получаем координаты мыши через вызов методов getX() и getY() класса MouseEvent и вызываем перерисовку. Наряду с методами getX() и getY() можно использовать и метод getPoint() - он возвращает объект типа Point.
А вот пример, в котором мы определяем, была ли при нажатии кнопки мыши удержана клавиша Alt:
public void mouseClicked(MouseEvent e){ if(e.isAltDown()){ p = e.getPoint(); // p - переменная типа Point. repaint(); } }Тут для опеределения, была ли нажата клавиша Alt, мы используем метод isAltDown класса MouseEvent. Соответствующие методы для других кнопок - это isControlDown() и isShiftDown().
Метод update()
Часто при перерисовке апплета надо отрисовывать заново не весь апплет, а только его часть. Например, у вас в апплете может быть неподвижный фон, по которому что-то там движеться. Для перерисовки в этом случае не надо перерисовывать весь фон, а только ту его часть, на которой находился и находится движущийся объект. При таким способе перерисовки мы избавимся и от неприятного мерцания нашего апплета.
Для такой частичной перерисовки мы использем не метод paint (который перерисовывает все), а метод update, который позволяет задать для перерисовки только часть апплета.
Вот пример, иллюстрирующий это:
public void update(Graphics g){ // Задаем прямоугольник для перерисовки. g.clipRect(0, 0, 50, 50); // Вызываем перерисовку. paint(g); }Здесь мы задаем прямоугольник для перерисовки с помощью метода clipRect класса Graphics. Параметры у него такие - x и y начальной точки и ширина с высотой. После задания прямоугольника для перерисовки мы вызываем метод paint, в который в качестве параметра передаем тот же самый g, для которого мы только что вызвали метод clipRect. Разумеется метод paint должен быть тоже определен в нашем апплете (например, такой, как в уроке 8).
Создание нового приложения для CDC – профиль AGUI
Ниже представлена процедура создания приложения для CDC (Xlet) для профиля AGUI с помощью инструментария Sun Java Toolkit для CDC 1.0.
В главном окне выберите "File > New Project" (Ctrl+Shift+N).
В области "Categories" выберите "Mobility". В "Projects" выберите "CDC Application". Нажмите кнопку "Next".
На странице "Name and Location":
Присвойте проекту имя newcdc.
Измените имя "Main Class Name" на newcdc.Mainxlet.
Не снимайте флажки "Set as Main Project" и "Create Main Class".
На странице "Select Platform" с помощью раскрывающихся меню выберите Sun Java Toolkit for Connected Device Configuration в поле "Java Platform" и DefaultColorPhone в поле "Device". Не изменяйте настройки профиля.
Нажмите кнопку "Finish". В результате создается новое приложение, и в GUI Builder открывается форма главного класса.
Создание интерфейса приложения с помощью Project Matisse GUI Builder
Редактор Project Matisse GUI Builder можно использовать таким же образом, как и при обычной разработке J2SE. В GUI Builder щелкните правой кнопкой мыши форму "Main.java" и выберите "Set Layout > Free Layout". Затем перетащите элементы из окна "Palette" в область проектирования в GUI Builder. Удостоверьтесь, что в форме используются только элементы Swing. Поскольку платформа AGUI поддерживает Swing, то доступны только элементы оформления окон Swing.
Для получения дополнительных сведений о создании графического интерфейса для приложений для CDC см. Разработка графического интерфейса при помощи пакета NetBeans Mobility Pack для CDC.
По завершении щелкните правой кнопкой мыши проект в окне "Projects" и выберите "Run Project". Созданное приложение должно отобразиться в эмуляторе устройства.
Теперь можно выполнить отладку проекта, а также создать и выполнить тесты с помощью инфраструктуры JUnit.
Создание нового приложения для CDC – профиль Personal Profile
Здесь создается апплет для профиля Personal Profile с помощью SDK платформы Nokia Series 80 для ОС Symbian, Java, Personal Profile. Платформа Sony Ericsson также поддерживает профиль Personal Profile.
Выберите "File > New Project" (Ctrl+Shift+N). В области "Categories" выберите "Mobility". В "Projects" выберите шаблон "CDC Application". Нажмите кнопку "Next".
Укажите имя проекта S80CdcApplication и определите его местоположение в системе. Не снимайте флажок "Create Main Class". Нажмите кнопку "Next".
На странице "Select Platform" выберите "Nokia S80 Platform".
Нажмите кнопку "Finish". Среда IDE создает новое приложение и открывает форму главного класса в GUI Builder, как показано на следующем рисунке. Для просмотра исходного кода апплета нажмите кнопку "Source". Обратите внимание, что автоматически созданный код основан на профиле. В данном случае главный класс получен на основе java.awt.Frame.
Создание интерфейса приложения с помощью Project Matisse GUI Builder
Редактор Project Matisse GUI Builder можно использовать таким же образом, как и при обычной разработке J2SE. В GUI Builder щелкните правой кнопкой мыши форму "Main.java" и выберите "Set Layout > Free Design". Затем перетащите элементы из окна "Palette" в область проектирования в GUI Builder. Удостоверьтесь, что в форме используются только элементы AWT. Поскольку все устройства Nokia Series 80 поддерживают профиль Personal Profile, то доступны только элементы оформления окон AWT.
Для получения дополнительных сведений об использовании GUI Builder в среде IDE см. учебную карту по графическому интерфейсу Java и Project Matisse.
По завершении щелкните правой кнопкой мыши проект в окне "Projects" и выберите "Run Project". Приложение должно отобразиться в меню "Applications" в эмуляторе устройства. После этого можно запустить устройство в эмуляторе.
Теперь можно выполнить отладку проекта, а также создать и выполнить тесты с помощью инфраструктуры JUnit.
Создание нового приложения для CDC – профиль Foundation Profile
Этот раздел посвящен созданию приложения для CDC (Xlet) для профиля Foundation Profile с использованием эмулятора Embedded Software Architecture Emulator 1.14c компании Ricoh.
Выберите "File > New Project" (Ctrl+Shift+N). В области "Categories" выберите "Mobility". В "Projects" выберите шаблон "CDC Application". Нажмите кнопку "Next".
На экране "Name and Location" присвойте проекту имя MyRicohApplication и укажите местоположение проекта. Не снимайте флажок "Create Main Class". Нажмите кнопку "Next".
На странице "Select Platform" выберите "Ricoh 1.14c".
Нажмите кнопку "Finish". В результате создается новое приложение, главный класс которого открывается в редакторе исходного кода. Структура проекта показана на следующем рисунке. Обратите внимание, что автоматически созданный код основан на профиле. В данном случае главный класс получен на основе jp.co.ricoh.dsdk.xlet.Xlet. В этом профиле отсутствует поддержка редактора GUI Designer среды NetBeans.
Для запуска проекта выберите "Run > Run Main Project". Эмулятор выводит на экран текст "TODO implement makeUIControls".
Теперь можно выполнить отладку проекта, а также создать и выполнить тесты с помощью инфраструктуры JUnit.
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class MobileTest extends MIDlet
implements CommandListener, ItemCommandListener{
private Display display;
private Form LogoForm,QForm;
public MobileTest() {}
//Список вопросов теста
private String quest[]={"Из всех домашних растений Вы предпочитаете кактусы.",
"Вы уже год не мыли полы, потому что можете случайно задеть компьютерные провода.",
"Отключение в районе электричества равносильно для Вас стихийному бедствию.",
"Вы можете не помнить, как выглядят Ваши друзья, но всегда знаете их ники.",
"Почтальоны пугаются, когда видят знак @ на отправляемых вами письмах.",
"Вы предпочитаете использовать принтер, а не ручку.",
"Вы очень удивляетесь, когда в видите надпись ЭТО МЫШЬ рядом с хвостаты зверем."};
private StringItem str; //Сторка
private ChoiceGroup myCG; //Варианты ответов
private TextField TFName,TFAge; //Имя и возраст
private int cqnum=0; //Номер текущего вороса
private int maxq=quest.length; //Число вопросов
private int summ=0; //Число набранных балов
//Создаем комманды
private Command CMD_GO = new Command("Вперед", Command.ITEM, 1);
private Command CMD_PRESS = new Command("Нажать", Command.ITEM, 1);
private Command CMD_FIRST = new Command("Начать", Command.SCREEN, 1);
private Command CMD_START = new Command("OK", Command.SCREEN, 1);
private Command CMD_NEXT = new Command("OK", Command.SCREEN, 1);
private Command CMD_FINISH = new Command("Закончить", Command.SCREEN, 1);
private Command CMD_EXIT = new Command("Выход", Command.EXIT, 1);
protected void destroyApp( boolean unconditional ) throws MIDletStateChangeException
{ exitApp(); } // вызывает уборщик мусора
protected void pauseApp() { }
protected void startApp() throws MIDletStateChangeException
{ if( display == null )
{ initApp(); } }
private void initApp() //Этот метод выполняется при запуске мидлета
{ display = Display.getDisplay( this );
LogoForm=new Form("Mobile Test - Мир ПК"); //Создаем первую форму
LogoForm.setCommandListener(this);
//Добавляем рисунок. Обратите внимание, рисунок загружается в скобках try{}catch{}
try{ Image img=Image.createImage("/Logo.png");
ImageItem FormImg=new
ImageItem("МирПК - Тест",img,ImageItem.LAYOUT_CENTER,"");
LogoForm.append(FormImg);
}catch(java.io.IOException ex){}
//Создаем подпись
str = new StringItem("aRix", "www.mobilab.ru", Item.HYPERLINK);
LogoForm.append(str);
//подключаем ссылку
str.setDefaultCommand(CMD_GO);
str.setItemCommandListener(this);
//Добавляем подэкранные кнопки
LogoForm.addCommand(CMD_FIRST);
LogoForm.addCommand(CMD_EXIT);
//Объявляем обработчик команд
display.setCurrent(LogoForm);
//Создаем форму для вопросов, добавляем на нее кнопки и объявляем обработчик
QForm=new Form("Вопрос");
QForm.addCommand(CMD_NEXT);
QForm.addCommand(CMD_EXIT);
QForm.setCommandListener(this);
//Создаем список с вариантами вариантов.
myCG=new ChoiceGroup("Ответ",Choice.EXCLUSIVE);
myCG.append("Нет",null);
myCG.append("Иногда",null);
myCG.append("Да",null); }
private void questForm(int qnum) //Форма с вопросами
{ QForm.deleteAll(); //Очищаем форму
//Добавляем вопрос из массива
str = new StringItem("Вопрос", quest[qnum]);
QForm.append(str);
//Добавляем на форму вырианты ответов
QForm.append(myCG);
//Делаем окно формы видимым
display.setCurrent(QForm); }
public void exitApp()
{ notifyDestroyed(); } // уничтожение MIDlet-а
public void commandAction(Command c, Item item) {
if (c == CMD_GO) {
String text = "Переход по ссылке...";
Alert a = new Alert("URL", text, null, AlertType.INFO);
display.setCurrent(a); } }
public void commandAction(Command c, Displayable d) {
if (c == CMD_FIRST) { //Команда: загрузить первый экран
//Создаем форму
Form firstForm=new Form("Представьтесь пожалуйста");
//Размещаем на ней поля для ввода текста
TFName=new TextField("Ваше имя","",25,TextField.ANY);
TFAge=new TextField("Ваш возраст","",3,TextField.NUMERIC);
firstForm.append(TFName);
firstForm.append(TFAge);
//Добавляем команды
firstForm.addCommand(CMD_START);
firstForm.addCommand(CMD_EXIT);
firstForm.setCommandListener(this);
//Делаем окно формы видимым
display.setCurrent(firstForm); }
if (c == CMD_START) {//Команда о начале теста
questForm(0); }
if (c == CMD_NEXT) {//Команда перехода к следующему вопросу
cqnum=cqnum+1; //Увеличивем номер вопроса
if (cqnum==maxq-1){ //Проверяем, не последний ли это вопрос. Если да, меняем кнопку.
QForm.removeCommand(CMD_NEXT);
QForm.addCommand(CMD_FINISH); }
summ=summ+myCG.getSelectedIndex(); //Учитываем результат последнего ответа
questForm(cqnum); } //Переходим к следующему вопросу
if (c == CMD_FINISH) { //Команда о получении результата
summ=summ+myCG.getSelectedIndex(); //Учитываем результат последнего ответа
QForm.deleteAll(); //Очищаем форму
QForm.append(""+TFName.getString()+", ну что Вам сказать. ");//Выводим текст
//В зависимости от набранных очков выводим результат теста и соответствующую картинку.
if (summ<1){
QForm.append("Срочно купите себе компьютер!!!");
try{
Image img=Image.createImage("/1.png");
ImageItem FormImg=new
ImageItem("",img,ImageItem.LAYOUT_CENTER,"");
QForm.append(FormImg);
}catch(java.io.IOException ex){} }
else if (summ<3){
QForm.append("На вашем месте, я бы почаще включал компьютер.");
try{
Image img=Image.createImage("/2.png");
ImageItem FormImg=new
ImageItem("",img,ImageItem.LAYOUT_CENTER,"");
QForm.append(FormImg);
}catch(java.io.IOException ex){} }
else if (summ<7){
QForm.append("Вы вполне адекватный человек.");
try{
Image img=Image.createImage("/3.png");
ImageItem FormImg=new
ImageItem("",img,ImageItem.LAYOUT_CENTER,"");
QForm.append(FormImg);
}catch(java.io.IOException ex){} }
else if (summ<7){
QForm.append("Возможна мама была права, когда пыталась выкинуть Ваш компьютер.");
try{
Image img=Image.createImage("/4.png");
ImageItem FormImg=new
ImageItem("",img,ImageItem.LAYOUT_CENTER,"");
QForm.append(FormImg);
}catch(java.io.IOException ex){}
}
else
{
QForm.append("По-моему Вам давно пора лечиться (Если что, я в 7 палате).");
try{
Image img=Image.createImage("/5.png");
ImageItem FormImg=new
ImageItem("",img,ImageItem.LAYOUT_CENTER,"");
QForm.append(FormImg);
}catch(java.io.IOException ex){}
}
//Удаляем кнопку
QForm.removeCommand(CMD_FINISH);
}
if (c == CMD_EXIT){exitApp();} //Команда "Выход"
}
}
– Конец работы –
Используемые теги: Введение, Java0.054
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Введение в Java
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов