Вступление
Примеры | Словарь |Вопросы
Sun Microsystems

Примеры программирования на Java

Загрузка изображений и обработка событий
(ultra.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