Рефераты
 

Створення навчальної програми по вивченню іноземної мови

p align="left">Спеціальне ім'я finalize зарезервоване для методу, який буде викликаний збирачем сміття перед тим, як об'єкт буде знищений. Внаслідок того, що Java звільняє нас від необхідності самим стежити за звільненням пам'яті, займаної об'єктами, необхідність в таких методах зазвичай виникає лише тоді, коли треба звільнити якісь зовнішні ресурси, наприклад, закрити відкритий файл: protected void finalize() { try { file.close(); } catch (Exception e) { } }.

Спадкоємство класів дозволяє створювати нові типи об'єктів, що ефективно використовують функціональність вже існуючих типів. Новий тип зазвичай називається похідним класом, а той, чиї властивості успадковуються, -- базовим класом.

Наприклад, ми можемо описати новий клас, відповідний координатам точки в тривимірному просторі, на основі вже описаного класу для точки на площині: class ThreePoint extends Point { protected double z; ThreePoint() { super(); z = 0.0; } ThreePoint(double x, double у, double z) { super(x, у); this.z = z; }}. Тут ми додали нову координату z, а поля x і у (і методи доступу до них) успадкували від класу Point.

Контроль доступу до даних і методів об'єкту в Java дещо відрізняється від С++. Крім трьох рівнів доступу, наявних в С++ (public, private, protected) є четвертий, такий, що знаходиться десь між рівнями public і protected. Він не має імені і використовується за умовчанням, коли явно не вказаний інший рівень. Поля цього типу доступні всередині тільки одного програмного пакету.

Пакет представляє групу класів, об'єднаних в одну логічну групу. Наприклад, класи, що описують точку і прямокутник в графічному пакеті, можуть мати прямий доступ до полів даних один одного, заборонений зазвичай для решти середовища.

Також слід зазначити, що контроль доступу в C++ допомагає програмістові лише при побудові програми. Відмінності між полями, поміченими public і private, відсутні у виконуваному модулі, створеному з використанням цієї мови. У Java контроль доступу реальний, оскільки він здійснюється не тільки при компіляції, але і безпосередньо перед запуском кодів на виконання віртуальною машиною.

Як і С++ мова Java дозволяє використовувати змінні і методи, що належать класу цілком. Для визначення їх використовується ключове слово static. Природно, що методи самого класу не можуть оперувати даними і методами об'єкту класу, оскільки вони не відносяться ні до якогось певного об'єкту.

Наприклад, версія реалізації класу Rectangle може бути задана таким чином: class Rectangle extends Object { static final int version = 2 ; static final int revision = 0 ; } Ключове слово final означає, що значення поля остаточне і зміні не підлягає (це константа).

Абстрактні методи -- це методи, для яких в даному класі не визначена їх реалізація. Ми указуємо лише на необхідність наявності методів з даним протоколом. Конкретна реалізація повинна бути здійснена класами-спадкоємцями. В той же час інша, “неабстрактна” частина класу може містити конкретну інформацію, яка може бути використана похідними класами. Наприклад: abstract class Graphical extends Object { protected Point lowerLeft; protected Point upperRight; … public void setPosition(Point ll, Point ur) { lowerLeft = ll; upperRight = ur; } abstract void drawMyself(); } class Rectangle extends Graphical { void drawMyself() { …. } } Тут ми описали клас Graphical.

У ньому оголошена властивість всіх графічних елементів мати якесь положення на площині. Кожен елемент зобов'язаний також мати метод для малювання самого себе, проте ніякого методу малювання за замовчуванням бути не може. Клас Rectangle, що є конкретною реалізацією для типа Graphical, реалізує також цей метод для об'єкту прямокутної форми.

Клас, що містить хоч би один абстрактний метод, повинен бути оголошений як абстрактний. Із зрозумілих причин створення екземплярів такого класу неможливе.

Таким чином ми висвітили наступні сторони Java як об'єктно-орієнтованої мови програмування:

- класи визначають шаблон, по якому створюються конкретні об'єкти;

- поля даних об'єкту визначають стан об'єкту;

- об'єкти обмінюються повідомленнями між собою; отримання повідомлення приводить до виклику одного з методів;

- методи визначають поведінку об'єкту даного класу; методи для різних класів можуть мати одне і те-ж ім'я, але різний зміст;

- не залежна від архітектури, переносима і інтелектуальна;

Це досягається перш за все стандартизацією “бінарного формату кодів”. Проміжний код не залежить від конкретної апаратної платформи, операційної системи і типу віконного інтерфейсу. Для того, щоб програми, написані на Java, могли працювати на даній апаратно-програмній платформі, достатньо, щоб для неї була створена лише відповідна віртуальна машина.

Компілятор Java проводить не “машинні коди” подібно до того, як це робить, наприклад, компілятор мови С. Замість цього генеруються так звані байт-коди: високорівневі, машинонезалежні коди для абстрактної машини, яка повинна бути реалізована у вигляді інтерпретатора Java і run-time системи.

Сама по собі ідея байт-кодів не нова, вони широко використовуються в різних системах починаючи з середини сімдесятих років. Особливості Java байт-машини наступні:

- набір її кодів легко не тільки інтерпретувати, але і ефективно скомпілювати “на льоту” безпосередньо в машинні коди для будь-якої сучасної апаратної платформи;

- коди містять додаткову інформацію, яка дозволяє перевірити їх на безпеку виконання.

Окрім незалежності кодів від конкретної архітектури, Java жорстко специфікує формат базових типів даних. Без цього одна і та ж програма, скомпільована для різних апаратних платформ, поводилася б по-різному. Наприклад, стандарт С/С++ не передбачає конкретного уявлення для цілого типу int. Передбачається, що цьому типу відповідає основний формат машинного слова для даної архітектури. В результаті програма, написана для 32-розрядного процесора, найчастіше переноситься на 16-розрядну архітектуру з дуже великими зусиллями.

Таким чином, рішення зафіксувати формати базових типів даних в Java цілком природне. Кожна Java-машина зобов'язана реалізувати їх таким чином: byte 8-bit two's complement short 16-bit two's complement int 32-bit two's complement long 64-bit two's complement float 32-bit IEEE 754 floating point double 64-bit IEEE 754 floating point char 16-bit Unicode character. Вибір саме такого набору базових типів і їх формату обумовлений тим, що практично будь-який сучасний центральний процесор підтримує ці формати.

Більш того, перенесення самого середовища може бути здійснене досить просто. Компілятор Java сам написаний на цій мові. Віртуальна машина написана на ANSI C відповідно до стандарту POSIX. Специфікація мови не містить посилань типу “залежно від конкретної реалізації”.

Система Java призначена для створення програмного забезпечення, яке повинне бути інтелектуальним, дуже надійним і безпечним по безлічі параметрів. Особлива увага приділяється як ранній діагностиці можливих проблем, так і пізніше, під час виконання кодів.

Компіляція з мови Java передбачає жорстку перевірку початкових текстів, безліч помилок може бути виявлено вже на цьому етапі.

Однією з переваг мови С++ як строго типізованої мови є можливість раннього виявлення деяких категорій помилок. Проте багато в чому ця мова успадковує властивості С, дозволяючи порушувати вимоги строгого оголошення функцій і методів. Мова Java вимагає явного оголошення прототипів і не підтримує характерних для С неявних перетворень.

Значне число перевірок, зроблених компілятором, повторюється віртуальною машиною безпосередньо перед виконанням програми. Лінкер отримує всю інформацію про прототипи методів і на основі її проводить таку ж перевірку, як і компілятор, дозволяючи уникнути розбіжностей у версіях між окремими модулями.

Найбільш істотна відмінність мови Java від С або С++ полягає в тому, що архітектура Java не дозволяє випадково або навмисно пошкодити пам'ять програми. Замість арифметики покажчиків Java використовує повноцінні об'єкти для масивів і рядків, що дозволяє контролювати індекси доступу до них під час виконання. Крім того, неможливі перетворення між цілими числами і покажчиками.

Природно, що все це не може повністю гарантувати програміста від будь-яких помилок, проте, Java усуває цілий клас їх, істотно полегшуючи завдання розробника.

2.3 Опис розробленої програми для вивчення

Іноземної мови

Структура шляхів

Структура директорій програми:

.

|-- lessons

| |-- first

| |-- second

| `-- test

|-- results.txt

|-- run.bat

|-- run.sh

`-- small.jar

Тут lessons -- директорія, в якій знаходяться директорії з уроками. results.txt файл з результатами тестів, run.bat -- пакетний файл для запуску програми в операційній системі MSWindows; run.sh -- пакетний файл для запуску програми в операційній системі GNU/ Linux; small.jar -- це Java архів з програмою, являє собою звичайний ZIP-архів, у якому міститься частина програми на мові Java.

Структура директорії тестом:

.

|-- images

|-- sounds

`-- words.csv

Тут каталог image містить фонові малюнки для слів тесту в форматі jpg з ім'ям співпадаючим зі словом в тесті.

Каталог sounds містить фонограми вимови для слів тесту в форматі wav з ім'ям співпадаючим зі словом в тесті.

Файл words.csv містить данні через ";" для тесту: такі, як тестове слово, слово з символом "_" замість пропущених букв, переклад та час в секундах, відведених на дане слово (якщо час 0 або відсутній, то таймер не вмикається).

Приклад: test;t_st;Тест;60

Структура каталогу с тестом first:

first

|-- images

| |-- apple.jpg

| |-- bear.jpg

| |-- bird.jpg

| |-- cat.jpg

| |-- clock.jpg

| |-- cloud.jpg

| |-- dog.jpg

| |-- doll.jpg

| |-- door.jpg

| `-- tree.jpg

|-- sounds

| |-- apple.wav

| |-- bear.wav

| |-- bird.wav

| |-- cat.wav

| |-- clock.wav

| |-- cloud.wav

| |-- dog.wav

| |-- doll.wav

| |-- door.wav

| `-- tree.wav

`-- words.csv

Вміст файлу words.csv директорії first:

apple;ap__e;Яблуко;60

cat;c_t;Кішка

dog;d_g;Собака;50

doll;d_ll;Лялька;0

tree;tre_;Дерево;40

door;d__r;Двері;30

clock;clo__;Годиник;30

bird;b_rd;Птах;20

cloud;cl__d;Хмара;20

bear;b__r;Ведмідь;10

Алгоритм програми

Запуск програми на платформі Windows здійснюється запуском пакетного файлу "run.bat". Зміст файлу run.bat:

@echo off

start javaw.exe -jar small.jar

Запуск програми на платформі GNU/Linux здійснюється запуском пакетного файлу "run.sh". Зміст файлу run.sh:

#!/bin/sh

java -jar small.jar $@

Також в обох платформах можна запустить програму, натиснувши на small.jar із провідника файлів. Але це подіє тільки у випадку якщо jar файли асоційовані в системі з віртуальною машиною Java.

Після передачі jar файлу віртуальній машині Java на виконання, в класі Main викликається метод main(), із якого викликається метод doLogin() і створюється об'єкт login класу Login, відповідальний за створення вікна входу в програму, запит імені користувача, пошук існуючих тестів в директорії програми методом Scan() класу Login та вибір тесту користувачем (рис. 2).

Рисунок 2 - Вікно входу в програму

Метод Scan() виконує пошук в директорії lessons і шукає там піддиректорії, які містять в собі файл words.csv:

public void Scan(String d){

File dir = new File(d);

String[] files = dir.list();

for(int i=0;i<files.length;i++){

if(new File(d+"/"+files[i].toString()+"/"+Main.ftxt).exists()) {

addL(files[i].toString());

}

}

}

Тут Main.ftxt - константа, описана в класи Main:

final static String ftxt = "words.csv";

Після вводу ім'я користувача в відповідну форму в вікні, вибір тесту (рис. 3) та натиснені кнопки входу, усі данні передаються в клас Main методом setEnv(), а вікно об'єкта login знищується.

Рисунок 3 -- Вибір із існуючих уроків

Метод setEnv() класу Main викликає метод doTest(), який створює об'єкт test класу Test:

public static void setEnv(String n,String l){

name = n;

less = l;

login = null;

doTest();

}

Тут поле name - ім'я користувача, less - шлях до директорії вибраного тесту.

Клас Test відповідає за створення основного вікна програми, всіх елементів управління та взаємодії з користувачем, вивід інформації на екран: текст та картинки. Також клас Test відповідає за зчитування клавіш, натиснутих користувачем.

static void doTest(){

test = new Test();

SwingUtilities.invokeLater(new Runnable() {

public void run() {

test.getJFrame().setVisible(true);

}

});

words = new Words(workdir,lessdir+less+"/",name,ftxt);

}

Також в методи doTest() створюються об'єкт words класу Words, який містить методи обробки тестів. Також клас Words містить методи роботи з файлами, наприклад метод парсингу файла words.csv:

void readFiles(){

File f= new File(workdir+ldir+ftxt);

String[] sbuff;

n=0;

try {

BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(f), Main.iocharset));

try {

String line = null;

while (( line = input.readLine()) != null){

sbuff = line.split("[ \";,\t]+");

// Слово з пропущеними літерами

try {

word_test[n] = sbuff[1].toUpperCase();

} catch(ArrayIndexOutOfBoundsException e){

word_test[n]=sbuff[0].toUpperCase();

}

// Переклад слова

try {

word_rus[n] = sbuff[2];

} catch(ArrayIndexOutOfBoundsException e){

word_rus[n]="";

}

// Картинка

try{

image[n] = ldir+imgdir+sbuff[0]+".jpg";

} catch(ArrayIndexOutOfBoundsException e){

image[n]=defimg;

}

// Звук (вимова)

try{

wav[n] = ldir+snddir+sbuff[0]+".wav";

} catch(ArrayIndexOutOfBoundsException e){

wav[n]=defwav;

}

// Час на тест

try{

time[n] = Integer.parseInt(sbuff[3]);

} catch(ArrayIndexOutOfBoundsException e){

time[n]= 0;

}

// Слово

try {

word_orig[n] = sbuff[0].toUpperCase();

} finally {

n++;

}

}

}

finally {

input.close();

}

}

catch (IOException ex){

ex.printStackTrace();

}

}

Після чого програма чекає натиснення кнопки "Розпочати тест" (рис. 4).

Рисунок 4 - Вікно привітання

Коли тест розпочато і для даного слова є обмеження по часу, вмикається таймер реалізований об'єктом timer класу Timer. По закінченні часу об'єкт timer викликає метод Main.test.Click(), цей же метод викликається, коли користувач натискає кнопку "Дати відповідь" або клавішу Enter на клавіатурі.

Метод Main.test.Click() викликає приватний метод doClick() об'єкта test. Він перевіряє чи є ще тести в списку і, якщо нема, викликаєтеся метод doSumary(), який видає результат тесту на екран та записує їх в файл results.txt.

За вивід голосових підказок (звуку в форматі wav) відповідає клас Wave.

Рисунок 5 -- Елементи управління тестом

На рисунку 5 зображенні елементи управління та взаємодії тесту:

1 -- екран візуального зображення слова; якщо файл з картинкою відсутній, то буде показаний логотип програми;

2 -- поле відповіді; в сірих квадратиках літери, які відомі; в білих, які треба вписати; ввід літери здійснюється з клавіатури; вибір та навігація здійснюється курсором миші та стрілками на клавіатурі, також працює клавіша “Backspace” та можна обрати букву, натиснувши на цифру на клавіатурі, відповідну тій, яка написана над квадратиком маленьким шрифтом;

3 -- кнопка відповіді та переходу до наступного тесту; аналогічну функцію виконує клавіша “Enter” на клавіатурі;

4 -- таймер зворотнього відліку у секундах; по закінченню відліку виконується функція, аналогічна натисненню кнопки 3;

5 -- переклад слова;

6 -- кнопка голосової (звукової) підказки; якщо звукового файлу не знайдено, кнопка не зображується;

7 -- порядковій номер тесту.

Розглянемо порядок роботи з текстом.

Дамо відповідь на перший тест (рис. 6). Натискаємо на клавіатурі клавіші “p” та “l” англійської розкладки, на українську розкладку клавіатури програма не реагує.

Рисунок 6 -- відповідь на перший тест

Натискаємо “Enter” або кнопку “Дати відповідь” і тестування переходить до другого тесту.

На другий тест навмисно відповімо невірно (рис. 7). Замість літери “A” запишемо “O”. Це нам потрібно для перевірки роботи алгоритму оцінювання.

Рисунок 7 -- Навмисно не вірна відповідь на тест 2

Далі відповідаємо вірно на тести від 3 до 10, всього в уроці “first” 10 тестових слів (тестів).

На третій тест правильна відповідь слово “DOG”, зображена на рисунку 8.

Рисунок 8 -- Відповідь на третій тест

У вікні тесту номер 4 відсутній таймер (рис. 8), також відсутній таймер в тесті 2. Це означає що тест буде очікувати відповіді доти, доки не буде натиснена кнопка “Дати відповідь” або клавіша “Enter” на клавіатурі. Це сталось завдяки тому, що в рядках файлу words.csv відсутнє або дорівнює 0 значення в 4-й колонці: cat;c_t;Кішка -- другий тест, та doll;d_ll;Лялька;0 -- четвертий тест.

Відповідь на тест номер 4 - “DOLL”.

Рисунок 9 -- відповідь на четвертий тест

Дамо відповіді на тести, що залишилися:

- відповідь на тест 5 “TREE”;

- відповідь на тест 6 “DOOR”;

- відповідь на тест 7 “CLOCK”;

- відповідь на тест 8 “BIRD”;

- відповідь на тест 9 “CLOUD”;

- відповідь на тест 10 “BEAR”.

По закінченню тестування на екран видається результат тестування, як показано на рисунку 10.

Рисунок 10 -- Результати тестування

У результати тестування входять такі пункти:

- прізвище та ім'я тестованого учня;

- назва уроку;

- загальне число балів, яке дорівнює кількості невідомих літер у всіх тестах, та кількість правильно названих літер у всіх тестах;

- процент успішності відповіді, який вираховується по формулі “100 ділити на кількість невідомих літер та помножити на кількість правильно названих літер” в методі,getProcent класу Words та округлюється до цілого за допомогою класу BigDecimal:

int getProcent() {

double pr;

pr = (100.00 / all) * all_clear;

BigDecimal x = new BigDecimal(pr);

return x.setScale(0, BigDecimal.ROUND_HALF_DOWN).intValue();

};

- оцінка в балах от 2 до 5, яка вираховується в залежності від проценту успішності в методі getBale() класу Words:

int getBale() {

float procent;

procent = getProcent();

if(procent<50){

return 2;

} else

if (procent<=75) {

return 3;

} else

if (procent<=95){

return 4;

} else

if (procent>95) {

return 5;

} else {

return -1;

}

}

При проценті менше 50% - оцінка 2, від 50% до 75% оцінка 3, від 75% до 95% оцінка 4, 95% і більше оцінка 5;

- виводиться таблиця, в якій перший стовпець це номер тесту, другий -- вірне слово, третій -- введене користувачем слово.

Також всі результати дописуються (без стирання попередніх результатів тестування інших учнів) в файл results.txt для наступного перегляду їх вчителем, в такому форматі:

Результати тестування Махно Марія (урок lessons/first/):

Загальне число балів 14 из 15.

Оцінка: 4 (93% успіху)

Тест №1 слово APPLE написано як APPLE

Тест №2 слово CAT написано як COT

Тест №3 слово DOG написано як DOG

Тест №4 слово DOLL написано як DOLL

Тест №5 слово TREE написано як TREE

Тест №6 слово DOOR написано як DOOR

Тест №7 слово CLOCK написано як CLOCK

Тест №8 слово BIRD написано як BIRD

Тест №9 слово CLOUD написано як CLOUD

Тест №10 слово BEAR написано як BEAR

Для завершення програми достатньо натиснути кнопку “Вихід”, або скористатись функціоналом операційної системи і закрити вікно.

3.4 З а х о д и п о о б с л у г о в у в а н н ю п р о г р а м и

Всі сирцеві коди та саму програму я розмістила в мережі Інтернет за адресою: http://code.google.com/p/smallenglish/, а тому, розробленна мною програма доступна всім зацікавленим.

Також можна скористатися системою контролю версій SVN (Subversion) і отримати зріз актуальної гілки розробки. Зробити це можна командою svn checkout http://smallenglish.googlecode.com/svn/trunk/ smallenglish-read-only або скориставшись одним із менеджерів роботи с SVN, наприклад qsvn.

Установка програми на операційній системі GNU\Linux (на прикладі openSUSE 11.0):

- установка java: sudo zypper install java-1_6_0-sun

- отримання архіву прогрими: wget http://smallenglish.googlecode.com/ files/SmallEnglish.tar.gz

- розкриття архіву: tar xvfz SmallEnglish.tar.gz

- запуск програми: cd SmallEnglish && sh run.sh

Структура вихідних кодів:

src

`-- mahno

`-- masha

`-- smallenglish

|-- Login.java

|-- Main.java

|-- Test.java

|-- Timer.java

|-- Wave.java

`-- Words.java

3.5 Л і с т і н г к о д у п р о г р а м и L o g i n. j a v a:

package mahno.masha.smallenglish;

import java.awt.BorderLayout;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JFrame;

import javax.swing.JTextField;

import javax.swing.JButton;

import java.awt.GridBagLayout;

import java.awt.GridBagConstraints;

import java.awt.Dimension;

import java.awt.Point;

import java.io.File;

import javax.swing.JComboBox;

class Login {

private JFrame jFrame = null;

private JPanel jContentPane = null;

private JLabel jLabel = null;

private JButton jButton = null;

private JPanel jPanel = null;

private JTextField name = null;

private JPanel jPanel1 = null;

String l;

private JLabel jLabel2 = null;

private JComboBox Lesss = null;

/**

* This method initializes jFrame

*

* @return javax.swing.JFrame

*/

JFrame getJFrame() {

if (jFrame == null) {

jFrame = new JFrame();

jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jFrame.setSize(300, 200);

jFrame.setLocation(new Point(0, 0));

jFrame.setResizable(false);

jFrame.setContentPane(getJContentPane());

jFrame.setTitle("Вхід");

}

return jFrame;

}

/**

* This method initializes jContentPane

*

* @return javax.swing.JPanel

*/

private JPanel getJContentPane() {

if (jContentPane == null) {

jLabel = new JLabel();

jLabel.setText("Ввести прізвище та ім'я:");

jContentPane = new JPanel();

jContentPane.setLayout(new BorderLayout());

jContentPane.add(getJPanel1(), BorderLayout.SOUTH);

jContentPane.add(getJPanel(), BorderLayout.CENTER);

}

return jContentPane;

}

/**

* This method initializes jButton

*

* @return javax.swing.JButton

*/

private JButton getJButton() {

if (jButton == null) {

jButton = new JButton();

jButton.setText("Вхід");

jButton.setEnabled(false);

jButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent e) {

doLogin();

}

});

}

return jButton;

}

void doLogin(){

if(jButton.isEnabled()){

Main.setEnv(name.getText(),l);

jFrame.setVisible(false);

jFrame.dispose();

}

}

/**

* This method initializes jPanel

*

* @return javax.swing.JPanel

*/

private JPanel getJPanel() {

if (jPanel == null) {

GridBagConstraints gridBagConstraints12 = new GridBagConstraints();

gridBagConstraints12.fill = GridBagConstraints.VERTICAL;

gridBagConstraints12.gridy = 3;

gridBagConstraints12.weightx = 1.0;

gridBagConstraints12.gridx = 0;

GridBagConstraints gridBagConstraints11 = new GridBagConstraints();

gridBagConstraints11.gridx = 0;

gridBagConstraints11.gridy = 2;

jLabel2 = new JLabel();

jLabel2.setText("Урок");

GridBagConstraints gridBagConstraints1 = new GridBagConstraints();

gridBagConstraints1.gridx = 0;

gridBagConstraints1.gridy = 0;

GridBagConstraints gridBagConstraints = new GridBagConstraints();

gridBagConstraints.fill = GridBagConstraints.VERTICAL;

gridBagConstraints.gridy = 1;

gridBagConstraints.weightx = 1.0;

gridBagConstraints.gridx = 0;

jPanel = new JPanel();

jPanel.setLayout(new GridBagLayout());

jPanel.add(getName(), gridBagConstraints);

jPanel.add(jLabel, gridBagConstraints1);

jPanel.add(jLabel2, gridBagConstraints11);

jPanel.add(getLesss(), gridBagConstraints12);

}

return jPanel;

}

/**

* This method initializes name

*

* @return javax.swing.JTextField

*/

private JTextField getName() {

if (name == null) {

name = new JTextField();

name.setPreferredSize(new Dimension(250, 19));

name.addKeyListener(new java.awt.event.KeyAdapter() {

public void keyTyped(java.awt.event.KeyEvent e) {

if(name.getText().length()>3 & l!=null){

jButton.setEnabled(true);

if(e.getKeyChar()=='\n'){

doLogin();

}

} else {

jButton.setEnabled(false);

}

}

});

}

return name;

}

/**

* This method initializes jPanel1

*

* @return javax.swing.JPanel

*/

private JPanel getJPanel1() {

if (jPanel1 == null) {

jPanel1 = new JPanel();

jPanel1.setLayout(new GridBagLayout());

jPanel1.add(getJButton(), new GridBagConstraints());

}

return jPanel1;

}

/**

* This method initializes Lesss

*

* @return javax.swing.JComboBox

*/

private JComboBox getLesss() {

if (Lesss == null) {

Lesss = new JComboBox();

Lesss.addItemListener(new java.awt.event.ItemListener() {

public void itemStateChanged(java.awt.event.ItemEvent e) {

l=e.getItem().toString();

}

});

}

return Lesss;

}

public void Scan(String d){

File dir = new File(d);

String[] files = dir.list();

for(int i=0;i<files.length;i++){

if(new File(d+"/"+files[i].toString()+"/"+Main.ftxt).exists()) {

addL(files[i].toString());

}

}

}

void addL(String s){

Lesss.addItem(new String(s));

}

}

Лістинг Main.java:

package mahno.masha.smallenglish;

import javax.swing.SwingUtilities;

public class Main {

final static int max_length = 16;

static Test test = null;

static Login login = null;

static String name;

static String less;

static String workdir;

static Words words;

final static String ftxt = "words.csv";

final static String lessdir = "lessons/";

final static String iocharset = "UTF-8";

final static String helppage = "system/help.html";

public static void main(String[] args) {

workdir = System.getProperty("user.dir")+"/";

doLogin();

}

public static void setEnv(String n,String l){

name = n;

less = l;

login = null;

doTest();

}

static void doTest(){

test = new Test();

SwingUtilities.invokeLater(new Runnable() {

public void run() {

test.getJFrame().setVisible(true);

}

});

words = new Words(workdir,lessdir+less+"/",name,ftxt);

}

static void doLogin(){

login = new Login();

SwingUtilities.invokeLater(new Runnable() {

public void run() {

login.getJFrame().setVisible(true);

login.Scan(workdir+lessdir);

}

});

}

public static void nextTest(){

words.nextTest();

test.rePaint();

}

public static void showHelp() {

java.awt.Desktop desktop = java.awt.Desktop.getDesktop();

try {

java.net.URI uri = new java.net.URI( "file://"+workdir+helppage );

desktop.browse( uri );

}

catch ( Exception er ) {

// System.err.println( er.getMessage() );

}

}

}

Лістинг Test.java:

package mahno.masha.smallenglish;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

import java.awt.BorderLayout;

import javax.swing.SwingConstants;

import javax.swing.SwingUtilities;

import java.awt.Point;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JMenuItem;

import javax.swing.JMenuBar;

import javax.swing.JMenu;

import javax.swing.JFrame;

import javax.swing.JDialog;

import javax.swing.Timer;

import java.awt.GridBagLayout;

import java.awt.Dimension;

import javax.swing.JButton;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.GridBagConstraints;

import java.awt.Color;

import java.awt.ComponentOrientation;

class Test {

final String question = "_"; // @jve:decl-index=0:

private JFrame jFrame = null; // @jve:decl-index=0:visual-constraint="10,10"

private JPanel jContentPane = null;

private JMenuBar jJMenuBar = null;

private JMenu fileMenu = null;

private JMenu helpMenu = null;

private JMenuItem exitMenuItem = null;

private JMenuItem aboutMenuItem = null;

private JDialog aboutDialog = null;

private JPanel aboutContentPane = null;

private JLabel aboutVersionLabel = null;

private JPanel top = null;

private JPanel bottom = null;

private JPanel left = null;

private JPanel right = null;

private JPanel screen = null;

private JButton button = null;

private JPanel pole = null;

private int lSize = 50;

private JPanel jPanel = null;

private Polekeys polekey[] = new Polekeys[Main.max_length]; // @jve:decl-index=0:

private Timer timer;

final Color bg = new Color(0x5B9DED);

final Color bn = new Color(0xE6F0FB);

boolean iskey = false;

boolean isend = false;

boolean cursor = true;

private JMenuItem instructionMenuItem = null;

public void rePaint() {

pole.repaint();

screen.repaint();

}

public void setFocus(){

pole.requestFocus();

}

/**

* This method initializes jFrame

*

* @return javax.swing.JFrame

*/

JFrame getJFrame() {

if (jFrame == null) {

jFrame = new JFrame();

jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jFrame.setPreferredSize(new Dimension(820, 760));

jFrame.setResizable(false);

jFrame.setJMenuBar(getJJMenuBar());

jFrame.setSize(820, 760);

jFrame.setContentPane(getJContentPane());

jFrame.setTitle("SmallEnglish");

}

return jFrame;

}

/**

* This method initializes jContentPane

*

Страницы: 1, 2, 3


© 2010 BANKS OF РЕФЕРАТ