Вступление Примеры | Словарь |Вопросы Sun Microsystems |
Примеры программирования на Java
import java.applet.*;
import java.awt.*;
//========================================
public class ultra extends Applet // Создание нового подкласса
{
final int count_jpg = 3; //Количество представленных картинок
Graphics g;
String description[];// Массив с названиями картинок
Image background; // Переменная для фонового изображения
Image animal_jpg[]; // Массив для загружаемых изображений
int width; // Данные переменные хранят ширину и
int height;// высоту фонового изображения
int current = 0;
boolean done_loading_image = false;
FontMetrics font_metrics;
boolean erased = false;
//=================================================================
public void init()
{
g = getGraphics();
Font font = new Font("TimesRomain", Font.BOLD,20);
g.setFont(font);
// Создание объекта FontMetrics, который позволяет
//определить ширину шрифта в пикселах
font_metrics = g.getFontMetrics();
// Получение изображения для фона из файла sun.jpg
background = getImage(getCodeBase(), "sun.jpg" );
width = size().width;
height = size().height;
Image offScrImage = createImage(size().width, size().height);
//Есть несколько способов вывода изображения на экран:
// аплет может рисовать изображение сразу в окне,
//но такой способ вызовет мерцание (которое Вы можете
// наблюдать при загрузке картинок Sun-станций).
//Это происходит из-за того, что drawImage не дожидается
//окончания загрузки изображения, а сразу возвращает управление.
//Другой способ ( а именно им загружается фоновое изображение) -
// сначало создается изображение вне экрана ( createImage), а
// затем выводится на экран функцией drawImage.
Graphics offScrGC = offScrImage.getGraphics();
offScrGC.drawImage(background, 0, 0, width, height, this);
// Загрузка изображений станций в массив
animal_jpg = new Image[count_jpg];
for (int i = 0; i < count_jpg; i++)
{
animal_jpg[i] = getImage(getCodeBase(), (i+1)+ ".jpg");
}
get_descriptions();
}
//==============================================================
void get_descriptions() // Задание массива-описания
{
description = new String[count_jpg];
description[0] = new String("Ultra 5");
description[1] = new String("Ultra 10");
description[2] = new String("Ultra 60");
}
//========================================================================
// Для отслеживания перемещений мыши используется
//функция mouseMove.Она передает в качестве параметров
// координаты x и y указателя мыши
public boolean mouseMove(Event evt, int x, int y)
{
int where = 0;
// boolean erased = false;
//Выделение области, чувствительной к перемещению мыши
if (( y > 25 & y < 225) & (x > 25 & x < 600 ))
{
int index = x/200;// Здесь храниться номер картинке в
// в массиве
where = index + 1;
// Переменная current позволяет определить выбрана ли какая-то сейчас
//картинка. Если в предыдущий момент была выбрана таже картинка, что
//и сейчас, то нет смысла делать какие-либо преобразования.
// current = 0 - значит ни одна не выбрана
// Если ни одна картинка сейчас не выбрана, то ничего удалять
// не нужно. Тогда сразу вызывается функция DrawName.
// В противном случае сначала удаляют название при помощи
// EraseName, а затем наносят новое функцией DrawName
if (current != where)
{
if (current != 0)
{
EraseName(current - 1);
erased = true;
}
System.out.println(description[index]);
DrawName(index);
}
}
if (current != 0 && current != where)
EraseName(current - 1);
current = where;
return true;
}
//=============================================================
public boolean mouseExit(Event evt, int x, int y)
// Если указатель мыши вышел из окна аплета
{
if (current != 0)
{
EraseName(current - 1);
erased = true;
}
return true;
}
//==============================================================
void EraseName(int index)
{
// Определение параметров шрифта
int stringW = font_metrics.stringWidth(description[index]);
int stringH = font_metrics.getHeight();
int x = (index%3)*200;
int y = (index/3)*200;
//Определение области, где выводилось сообщение
int X = (x/200)*200 + 100 - stringW/2 + 25;
int Y = ((y+200)/200)*200 + 25;
// При удалении надписи неоходимо восстановить "старое" фоновое
// изображение. Для этого достаточно перерисовать только
// невидимую часть. Для этого создается копия графического
// контекста G.
Graphics G;
G = g.create();
// Затем clipRect создает прямоугольник отсечения ( там где раньше
//содержалось название станции )
G.clipRect(X, Y-stringH, stringW, stringH);
// После аплет перерисовывает ранее скрытую область
G.drawImage(background, 0, 0, width, height, null);
G.drawImage(animal_jpg[index], x+25, y+25, this);
}
//====================================================================
void DrawName(int index)
{
// Определение параметров шрифта
int stringW = font_metrics.stringWidth(description[index]);
int stringH = font_metrics.getHeight();
int x = (index%3)*200;
int y = (index/3)*200;
//Определение области, где выводить сообщение
int X = (x/200)*200 + 100 - stringW/2 + 25;
int Y = ((y+200)/200)*200 + 25;
// Установка цвета области
g.setColor(Color.black);
g.fillRect( X, Y-stringH, stringW, stringH);
// Установка цвета текста
g.setColor(Color.white);
// Вывод названия станции
g.drawString(description[index], X, Y-font_metrics.getDescent());
}
//=======================================================================
public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h)
{
// Пока фоновое изображение загружается, параметр
// infoflags не равен ALLBITS. Переменная done_loading_image
// равна false, и в строке статуса Вы видите Loading
if ( infoflags == ALLBITS)
{
done_loading_image = true;
repaint();
return false;
}
else
return true;
}
//===============================================================
public void paint(Graphics g)
{
if (!done_loading_image)
showStatus("Loading");
else
{
showStatus("Done");
g.drawImage(background, 0, 0, width, height, this);
for (int i =0 ; i < 1; i++)
for (int j = i*count_jpg; j |
||