Dodatki

Dodatek A Unicode

UNICODE jest standardem kodowania znaków na dwu bajtach, pozwalającym na zdefiniowanie 65536 znaków, bez potrzeby używania różnych stron kodowych dla alfabetów narodowych. Dla kodowania w standardzie ASCII (kodowanie na jednym bajcie) mamy do dyspozycji jedynie 256 znaków i aby uzyskać litery z różnych alfabetów narodowych, trzeba stosować strony kodowe

W poniższej tabeli zestawiono znaki Unicode kodujące polskie litery:

Litera Kod Unicode Litera Kod Unicode
Ą 0104 Ó 00D3
ą 0105 ó 00F3
Ć 0106 Ś 015A
ć 0107 ś 015B
Ę 0118 Ź 0179
ę 0119 ź 017A
Ł 0141 Ż 017B
ł 0142 ż 017C

Tabela 6-1 Zestawienie znaków Unicode kodujących polskie litery.

Aby w programie Javy użyć znaków Unicode stosujemy następującą konwencję:

\ukod_znaku

Przykład:

public void paint(Graphics g)
{
	g.drawString("Dzi\u0119kuj\u0119 ",10,10);
}

Powyższa metoda paint() apletu, drukuje na ekranie słowo Dziękuję.

Znaki Unicode są wyświetlane, jeśli system, w którym uruchamiane są programy stosujące znaki Unicode implementuje kodowanie znaków Unicode. W przypadku, gdy w zbiorze czcionek nie jest dostępny obraz graficzny reprezentujący dany znak, powinien być wyświetlony automatycznie znak podobny (np. gdy brak litery Ś wyświetlana jest litera S ).

Uwaga:

Obecnie standard Unicode nie jest jeszcze zaimplementowany we wszystkich systemach operacyjnych i przeglądarkach.

Tabele wszystkich znaków Unicode dostępne są w Internecie pod adresem: http://www.unicode.org/

 

Dodatek B Zestawienie różnic między AWT 1.0 a AWT 1.1
obsługa zdarzeń AWT 1.0 obsługa zdarzeń AWT 1.1
Zdarzenie / Metoda Wygenerowana przez Interfejs Metoda
ACTION_EVENT/action
Button, List,
MenuItem, TextField 
ActionListener 
actionPerformed(ActionEvent) 
ACTION_EVENT/action
Checkbox, 
CheckboxMenuItem
Choice 
ItemListener
itemStateChanged(ItemEvent)
 WINDOW_DESTROY
 WINDOW_EXPOSE
 WINDOW_ICONIFY
 WINDOW_DEICONIFY 
Dialog, Frame 
WindowListener 
windowClosing(WindowEvent) 
windowOpened(WindowEvent) 
windowIconified(WindowEvent)
 windowDeiconified(WindowEvent)
windowClosed(WindowEvent)* 
windowActivated(WindowEvent)*
windowDeactivated(WindowEvent)* 
WINDOW_MOVED 
Dialog, Frame 
ComponentListener 
componentMoved(ComponentEvent)
componentHidden(ComponentEvent)*
componentResized(ComponentEvent)*
componentShown(ComponentEvent) * 
SCROLL_LINE_UP
 SCROLL_LINE_DOWN
 SCROLL_PAGE_UP 
SCROLL_PAGE_DOWN 
SCROLL_ABSOLUTE 
SCROLL_BEGIN 
SCROLL_END 
Scrollbar 
AdjustmentListener 
(lub użyj nowej klasy 
ScrollPanel) 
adjustmentValueChanged(AdjustmentEvent)
LIST_SELECT 
LIST_DESELECT 
Checkbox, 
CheckboxMenuItem 
Choice, List 
ItemListener 
itemStateChanged(ItemEvent) 
MOUSE_DRAG 
/mouseDrag 
MOUSE_MOVE 
/mouseMove 
Canvas, Dialog,
Frame, Panel,
Window 
MouseMotionListener
mouseDragged(MouseEvent) 
mouseMoved(MouseEvent) 
MOUSE_DOWN /mouseDown 
MOUSE_UP /mouseUp 
MOUSE_ENTER 
/mouseEnter 
MOUSE_EXIT /mouseExit 
Canvas, Dialog,
Frame, Panel,
Window 
MouseListener 
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mouseClicked(MouseEvent)*
KEY_PRESS/keyDown 
KEY_RELEASE/keyUp 
KEY_ACTION /keyDown
KEY_ACTION_RELEASE
/keyUp
Component 
KeyListener 
keyPressed(KeyEvent) 
keyReleased(KeyEvent) 
keyTyped(KeyEvent)*
GOT_FOCUS/gotFocus 
LOST_FOCUS/lostFocus 
Component 
FocusListener 
focusGained(FocusEvent) 
focusLost(FocusEvent) 
brak odpowiednika 
w wersji 1.0
 
ContainerListener 
componentAdded(ContainerEvent) 
componentRemoved(ContainerEvent) 
brak odpowiednika w wersji 1.0  
TextListener 
textValueChanged(TextEvent)
Uwagi:* brak odpowiednika w wersji 1.0

Tabela 6-2 Tabela konwersji obsługi zdarzeń z wersji AWT 1.0 do 1.1

"Stara" metoda
z AWT 1.0
Klasa w której nastąpiła zmiana Wymiennik z AWT 1.1
 action 
 Component 
 actionPerformed
AllowsMultipleSelections 
 List 
 isMultipleMode 
 appendText 
 TextArea 
 append 
 bounds 
 Component 
 getBounds 
 clear 
 List 
 removeAll 
 countComponents 
 Container 
 getComponentCount 
 countItems 
 Choice, List, Menu 
 getItemCount 
 countMenus 
 MenuBar 
 getMenuCount 
 deliverEvent 
 Component, Container 
 dispatchEvent 
 disable() 
 MenuItem 
 setEnabled(false) 
 enable() 
 Component, MenuItem 
 setEnabled(true) 
 enable(expression) 
 Component 
 setEnabled(expression) 
 getBoundingBox 
 Polygon 
 getBounds 
 getClipRect 
 Graphics 
 getClipBounds 
 getCurrent 
 CheckboxGroup 
 getSelectedCheckbox 
 getCursorType 
 Frame 
 metoda getCursor w klasie Component 
 getLineIncrement 
 Scrollbar 
 getUnitIncrement 
 getPageIncrement 
 Scrollbar 
 getBlockIncrement 
 getPeer 
 Component 
 No replacement. 
 GetVisible 
 Scrollbar 
 getVisibleAmount 
 gotFocus 
 Component 
 processFocusEvent 
 HandleEvent 
 Component 
 processEvent 
 Hide 
 Component 
 setVisible(false) 
 insertText 
 TextArea 
 insert 
 insets 
 Container 
 getInsets 
 inside 
Component, Polygon, 
Rectangle 
 contains 
 isSelected 
 List 
 isIndexSelected 
 keyDown 
 Component 
 processKeyEvent 
 KeyUp 
 Component 
 processKeyEvent 
 Layout 
Component, Container, 
ScrollPane 
 doLayout 
 locate 
 Component, Container 
 getComponentAt 
 location 
 Component 
 getLocation 
 lostFocus 
 Component 
 processFocusEvent 
 MinimumSize 
 Component, Container, 
TextArea, TextField 
 getMinimumSize 
 mouseDown 
 Component 
 processMouseEvent 
 MouseDrag 
 Component 
 processMouseMotionEvent 
 MouseEnter 
 Component 
 processMouseEvent 
 MouseExit 
 Component 
 processMouseEvent 
 MouseMove 
 Component 
 processMouseMotionEvent
 MouseUp 
 Component 
 processMouseEvent 
 Move 
 Component, Rectangle 
 setLocation 
 nextFocus 
 Component, Container, 
Window 
 transferFocus 
 postEvent 
 Component, Window 
 dispatchEvent 
 preferredSize 
Component,Container, 
TextArea, TextField 
 getPreferredSize 
 replaceText 
 TextArea 
 replaceRange 
 reshape 
 Component, Rectangle 
 setBounds 
 resize 
 Component, Rectangle 
 setSize 
 setCurrent 
 CheckboxGroup 
 setSelectedCheckbox 
 setCursor 
 Frame 
 metoda setCursor w klasie Component 
 setEchoCharacter 
 TextField 
 setEchoChar 
 setLineIncrement 
 Scrollbar 
 setUnitIncrement 
 setMultipleSelections 
 List 
 setMultipleMode 
 setPageIncrement 
 Scrollbar 
 setBlockIncrement 
 show() 
 Component 
 setVisible(true) 
 show(expression) 
 Component 
 setVisible(expression) 
 size 
 Component 
 getSize

Tabela 6-3 Zestawienie zmian w AWT 1.1 w porównaniu do AWT 1.0

Uwaga: W tabeli tej zestawione są zmienione elementy AWT nie uwzględniono tu nowych elementów AWT 1.1.

Dodatek C Szkielet apletu wielowątkowego

Tworząc nowy aplet w środowisku Visual J++ 1.1 możemy skorzystać ze standardowego szkieletu apletu wielowątkowego, który możemy dowolnie modyfikować. W przedstawionej w poniższym przykładzie wersji apletu, ładowane są obrazki, które będą służyły jako klatki animacji. Po załadowaniu wszystkich obrazków uruchamiany jest aplet.

Ten przykładowy kod, może być przez nas, oczywiście, wykorzystany w innych środowiskach programistycznych Javy przy tworzeniu apletów zawierających animacje lub korzystających z wielowątkowości.

Przykład 6.1 Szkielet apletu wielowątkowego

//***************************************************************
// MultiAplet.java:	Applet
//***************************************************************
import java.applet.*;
import java.awt.*;
//===============================================================
// Main Class for applet MultiAplet
//===============================================================
public class MultiAplet extends Applet implements Runnable
{
	// THREAD SUPPORT:
	//		m_MultiAplet	is the Thread object for the applet
	//-----------------------------------------------------------
	private Thread	 m_MultiAplet = null;

	// ANIMATION SUPPORT:
	//		m_Graphics		used for storing the applet's Graphics context
	//		m_Images[]		the array of Image objects for the animation
	//		m_nCurrImage	the index of the next image to be displayed
	//		m_ImgWidth		width of each image
	//		m_ImgHeight		height of each image
	//		m_fAllLoaded	indicates whether all images have been loaded
	//		NUM_IMAGES 		number of images used in the animation
	//------------------------------------------------------------
	private Graphics m_Graphics;
	private Image	 m_Images[];
	private int 	 m_nCurrImage;
	private int 	 m_nImgWidth  = 0;
	private int 	 m_nImgHeight = 0;
	private boolean  m_fAllLoaded = false;
	private final int NUM_IMAGES = 18;

	// MultiAplet Class Constructor
	//-----------------------------------------------------------
	public MultiAplet()
	{
		// TODO: Add constructor code here
	}

	// APPLET INFO SUPPORT:
	//		The getAppletInfo() method returns a string describing the 
	// applet's author, copyright date, or miscellaneous information.
	//--------------------------------------------------------------
	public String getAppletInfo()
	{
		return "Name: MultiAplet\r\n" +
			   "Author: Artur Tyloch\r\n" +
			   "Created with Microsoft Visual J++ Version 1.1";
	}
	//The init() method is called by the AWT when an applet is first 
	//loaded or reloaded. Override this method to perform whatever 
	// initialization your applet needs, such as initializing data 
	// structures, loading images or fonts, creating frame windows, 
	// setting the layout manager, or adding UI components.
	//------------------------------------------------------------
	public void init()
	{
		// If you use a ResourceWizard-generated "control creator" 
		// class to arrange controls in your applet, you may want to 
		// call its CreateControls() method from within this method. 
		// Remove the following call to resize() before adding the call 
		// to CreateControls();
		// CreateControls() does its own resizing.
		//----------------------------------------------------------
		resize(320, 240);

		// TODO: Place additional initialization code here
	}

	// Place additional applet clean up code here.  destroy() is 
	// called when when you applet is terminating and being unloaded.
	//-------------------------------------------------------------
	public void destroy()
	{
		// TODO: Place applet cleanup code here
	}

	// ANIMATION SUPPORT:
	//		Draws the next image, if all images are currently loaded
	//-------------------------------------------------------------
	private void displayImage(Graphics g)
	{
		if (!m_fAllLoaded)
			return;

		// Draw Image in center of applet
		//-----------------------------------------------------------
		g.drawImage(m_Images[m_nCurrImage],
				   (size().width - m_nImgWidth)   / 2,
				   (size().height - m_nImgHeight) / 2, null);
	}

	// MultiAplet Paint Handler
	//--------------------------------------------------------------
	public void paint(Graphics g)
	{
		// ANIMATION SUPPORT:
		//		The following code displays a status message until all the
		// images are loaded. Then it calls displayImage to display the 
		// current image.
		//-----------------------------------------------------------
		if (m_fAllLoaded)
		{
			Rectangle r = g.getClipRect();
			
			g.clearRect(r.x, r.y, r.width, r.height);
			displayImage(g);
		}
		else
			g.drawString("Loading images...", 10, 20);

		// TODO: Place additional applet Paint code here
	}

	//		The start() method is called when the page containing the 
	// applet first appears on the screen. The AppletWizard's initial 
	// implementation of this method starts execution of 
	// the applet's thread.
	//----------------------------------------------------------------
	public void start()
	{
		if (m_MultiAplet == null)
		{
			m_MultiAplet = new Thread(this);
			m_MultiAplet.start();
		}
		// TODO: Place additional applet start code here
	}
	
	//		The stop() method is called when the page containing the 
	// applet is no longer on the screen. The AppletWizard's initial 
	// implementation of this method stops execution of 
	// the applet's thread.
	//--------------------------------------------------------------
	public void stop()
	{
		if (m_MultiAplet != null)
		{
			m_MultiAplet.stop();
			m_MultiAplet = null;
		}

		// TODO: Place additional applet stop code here
	}

	// THREAD SUPPORT
	//		The run() method is called when the applet's thread is 
	// started. If your applet performs any ongoing activities without 
	// waiting for user input, the code for implementing that behavior 
	// typically goes here. For example, for an applet that performs 
	// animation, the run() method controls the display of images.
	//----------------------------------------------------------------
	public void run()
	{
		m_nCurrImage = 0;
		
		// If re-entering the page, then the images have already 
		// been loaded.
		// m_fAllLoaded == TRUE.
		//------------------------------------------------------------
		if (!m_fAllLoaded)
		{
			repaint();
			m_Graphics = getGraphics();
			m_Images   = new Image[NUM_IMAGES];

			// Load in all the images
			//---------------------------------------------------------
			MediaTracker tracker = new MediaTracker(this);
			String strImage;

			// For each image in the animation, this method first 
			// constructs a string containing the path to the image file; 
			// then it begins loading the image into the m_Images array.  
			// Note that the call to getImage will return before the 
			// image is completely loaded.
			//---------------------------------------------------------
			for (int i = 1; i <= NUM_IMAGES; i++)
			{
				// Build path to next image
				//-------------------------------------------------------
				strImage = "images/img00" + ((i < 10) ? "0" : "") +
																 i + ".gif";
				m_Images[i-1] = getImage(getDocumentBase(), strImage);

				tracker.addImage(m_Images[i-1], 0);
			}

			// Wait until all images are fully loaded
			//----------------------------------------------------------
			try
			{
				tracker.waitForAll();
				m_fAllLoaded = !tracker.isErrorAny();
			}
			catch (InterruptedException e)
			{
				// TODO: Place exception-handling code here in case an
				//	   InterruptedException is thrown by Thread.sleep(),
				//		 meaning that another thread has interrupted this one
			}
			
			if (!m_fAllLoaded)
			{
				stop();
				m_Graphics.drawString("Error loading images!", 10, 40);
				return;
			}
			

			// Assuming all images are same width and height.
			//---------------------------------------------------------
			m_nImgWidth  = m_Images[0].getWidth(this);
			m_nImgHeight = m_Images[0].getHeight(this);
		}		
		repaint();

		while (true)
		{
			try
			{
				// Draw next image in animation
				//-------------------------------------------------------
				displayImage(m_Graphics);
				m_nCurrImage++;
				if (m_nCurrImage == NUM_IMAGES)
					m_nCurrImage = 0;

				// TODO:  Add additional thread-specific code here
				Thread.sleep(50);
			}
			catch (InterruptedException e)
			{
				// TODO: Place exception-handling code here in case an
				//	   InterruptedException is thrown by Thread.sleep(),
				//		 meaning that another thread has interrupted this one
				stop();
			}
		}
	}
	// TODO: Place additional applet code here
}

Po uruchomieniu tego apletu na ekranie widzimy obracającą się kulę ziemską:

Ilustracja 6-1 Obraz działania wygenerowanego przez Visual J++ 1.1 szkieletu apletu.

Dodatek D Kod apletu z buforowaniem MojRysownik

Opis patrz punkt.

import java.applet.*;
import java.awt.*;
public class MojRysownik extends Applet implements Runnable
{
	private int m_X = 60, m_Y = 50, m_oldX, m_oldY;
	private Thread animWatek;
	private Font font;
	private Graphics buforGraf;
	private Image bufor;
	private Dimension rozmiarBuf, d; 
	public void init()
	{
		d = this.size();
		font = new Font("Arial", Font.BOLD, 20);
		m_oldX=m_X;
		m_oldY=m_Y;
	}
	public void start()
	{
		if (animWatek == null) animWatek = new Thread(this,"Rysownik");
		animWatek.start();
	}
	public void stop()
	{
		if (animWatek != null)	animWatek.stop();
		animWatek=null;
	}
	
	public void run()
	{
		boolean lewo = true;
		while (Thread.currentThread() == animWatek) 
		{
			if (m_X > 110) lewo = true;
			if (m_X < 10) lewo = false;
			if (lewo)
				{	m_X--;	m_Y--;	}
			else
				{	m_X++;	m_Y++;	}
			repaint();
			try {
				Thread.sleep(50);
			} catch (InterruptedException e){
			}
		}
	}
	private void kolka(Graphics g, int x)
	{
		for (int i = 0; i<7; i++ )
			g.drawOval(x+i*21,30,20,20);
	}

	public void paint(Graphics g)
	{	update(g);	}
	public void update(Graphics g) 
	{
		// zmiena d przechowuje rozmiar obszaru rysowania na ekranie: 
		if ( (buforGraf == null)  || (d.width != rozmiarBuf.width)  || (d.height != rozmiarBuf.height) ) 
		{
			rozmiarBuf = d;
			bufor = createImage(d.width, d.height);
			buforGraf = bufor.getGraphics();
		}  
		buforGraf.setFont(font);
		buforGraf.setColor(getBackground());
		buforGraf.fillRect(0, 0, d.width, d.height);
    		buforGraf.setColor(Color.black);
		buforGraf.fillRect(10,50,280,25);
		buforGraf.setColor(Color.white);
		buforGraf.drawString("animacja z buforowaniem", m_X, 20);
		buforGraf.setColor(Color.yellow);
		buforGraf.drawString("autor: arturt tyloch", 40, m_Y);
		buforGraf.setColor(Color.black);
		kolka(buforGraf, m_X);
		g.drawImage(bufor, 0, 0, this);
	}
}


Dodatek E Wersja apletu ZaladujURL z obsługą zdarzeń w modelu delegacyjnym

Opis patrz.

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class ZaladujURL extends Applet
{
	public void init()
	{
		final Button btnZaladuj = new Button("Zaladuj strone");
		final TextField txtCo = new 
				TextField("http://friko.onet.pl/po/arturt/index.html");
		setLayout(new BorderLayout());	
		add("North",txtCo);
		add("Center",btnZaladuj);
		btnZaladuj.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent evt) 
 					{
 						if (evt.getSource() == btnZaladuj)
						try
						{
							getAppletContext().showDocument(new 
								java.net.URL(getCodeBase()+"tmp.html"),"_self");
						}
						catch (Exception exc)
						{ 
							exc.printStackTrace(); 
							txtCo.setText("Zly adres");
						}
							
					}
				});				
	}
}