7 tema. Langų gamybos įrankinė (AWT)

Turinys
 Ką galima rasti įrankių dėžutėje?
 Gana tų juodų langų...
 Sukurti ir sudėti
 Įvykiai ir reagavimas į juos
 Button, TextField, TextArea
 Checkbox, CheckboxGroup
 List ir Choice
 Canvas
 Įvykiai, kuriuos sukelia pelė
 Užduotis

Ką galima rasti įrankių dėžutėje

Programuodami įskiepius jau naudojome keletą grafinių komponenčių, palengvinančių vartotojo darbą su programa. Naudojome mygtukus, antraštes, teksto laukus... Visų šių ir dar nematytų įrankių klasės yra pakete java.awt (AWT - abstract window toolkit). Taigi norint naudotis šiais įrankiais reikia programos teksto pradžioje įrašyti eilutę
 import.java.awt.*;
O dabar apžvelkime jau minėtus ir neminėtus įrankius, sudėję juos į vieną langą.

Visi čia parodyti lango komponentai (išskyrus antraštę) generuoja įvykius. Įvykius reikia stebėti. ,,Stebėjimo įrenginių" klasės yra pakete java.awt.event. Taigi programos teksto pradžioje reikalinga dar viena eilutė:
 import.java.awt.event.*;
Tačiau pasyviai stebėti įvykius maža - programa turi į juos reaguoti taip, kaip mums reikia. Kokius veiksmus reikia atlikti galime nurodyti tik mes patys.
Taigi programos lango kūryba vyksta taip:

Gana tų įskiepių ir juodų langų!

Mokame rašyti Java įskiepius ir iš komandinės eilutės vykdomas programas. Tačiau pastarosios neatrodo labai patraukliai - ir rezultatai, ir pranešimai atsiranda juodame lange ir tiek. Kaip padaryti, kad Java programų aplinka ne vien tik naršyklių languose atrodytų gražiai? Štai tokios programos rėmai:
	  
import java.awt.*;
import java.awt.event.*;

class ManoLangas extends Frame {
	
public ManoLangas() {
setSize(400,300); // Programos lango matmenys 
setTitle("Mano programos langas");// antraštė 
		
// Čia nurodome kitus darbus, kuriuos turi nuveikti klasės konstruktorius
show();//Sukurtą langą reikia parodyti! 
// Keturios eilutės nurodo, kaip reaguoti į įprastinį įvykį 
// pelės klavišo spragtelėjimą lango kamputyje: langas uždaromas
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
} });
}
//
//Kaip visada - reikalingas pagrindinis  metodas, kuriuo prasideda darbas 
public static void main(String args[]) { 
new ManoLangas();
}
}
Ši programa nieko nedaro - sukuria langą ir tiek. Sukurti gyvenimą jame - jūsų uždavinys.
Atsisiųskite programos tekstą. Nuo jo galite pradėti kurti savo programas.

Į pradžią

Sukurti ir sudėti

Sukurti komponentę nesunku - kaip ir kiti Java objektai, juos sukuriame iškvietę konstruktorius. Konstruktoriams galima nurodyti tam tikrus parametrus. Pavyzdžiui, užrašę tokias eilutes sukursime tris antraštes ir du mygtukus. Pirmoji antraštė bus tuščia (tekstą galima pridėti vėliau), kitų antraščių tekstai nurodyti, be to dar nurodyta, kad trečios antraštės tekstą reikia centruoti. Pirmasis sukurtas mygtukas neturi užrašo, o antrajam užrašas nurodytas.
Label antr1= new Label();
Label antr2= new Label("Pirma antraštė");
Label antr3= new Label("Antra antraštė", Label.CENTER);
Button mygt1= new Button();
Button mygt2= new Button("Mygtukas");
Nesudėtinga sukurti ir kitas komponentes. Bus patogiau, jei kitų komponenčių konstruktorius ir jų parametrus aptarsime kartu su metodais. O dabar apžvelkime, kaip sukurtus objektus išdėstyti.

Komponentėms išdėstyti lange galime pasitelkti objektą Layout Manager. AWT pakete yra kelių rūšių ,,išdėstymo vadybininkų" klasės: Aptarsime tik tris pirmuosius išdėstymo būdus. Pirmasis ,,vadybininkas" (FlowLayout) iškviečiamas pagal nutylėjimą įskiepyje. Taigi, jeigu programuodami įskiepį nieko nenurodysite - jis ,,vadovaus paradui".
Išdėstymų stiliams palyginti į tuščią langą sudėsime keturis mygtukus, naudodamiesi skirtingais Layout Manager objektais.
import java.awt.*;
import java.awt.event.*;

class Isdest extends Frame {
    
public Isdest() {
		
setSize(400,100);
setTitle("Mano programos langas");
setLayout(new FlowLayout());
Button [] mygt= new Button [4];
String [] antr ={"Pirmas", "Antras","Trecias", "Ketvirtas"};
		
for (int i=0; i<4; i++){
mygt[i]=new Button(antr[i]);
add(mygt[i]);
 }
show();
		
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
} });}

public static void main(String args[]) {
new Isdest();}
}
Atsisiųskite programos tekstą.

FlowLayout išdėstymas
O dabar pasinaudosime BorderLayout paslaugomis. Pakeisime mygtukų užrašus, be to sudėdami mygtukus nurodysime, kur juos (Šiaurės, Pietų, Rytų ar Vakarų pusėje) padėti. Lango centrą paliksime tuščią. Užrašykime, kelias pakeistas programos teksto eilutes:
.....
setLayout(new FlowLayout());
....
add("North",mygt[0]);
add("East",mygt[1]);
....

Į pradžią   

BorderLayout išdėstymas
Norėdami išdėstyti komponentes lentele, turime nurodyti, kiek eilučių ir stulpelių ši lentelė turi turėti. Pavyzdžiui, norėdami, kad mūsų keturi mygtukai būtų išdėstyti lentelėje, turinčioje dvi eilutes ir du stulpelius, turime išdėstymo objektą sukurti taip:
 .........
 setLayout(new GridLayout(2,2));
 .........
 
GridLayout išdėstymas
Ar būtina naudoti kurį nors Layout Manager objektą? Nebūtina. Jeigu nepatinka nei vienas, galite nurodyti
 setLayout(null);
 
ir patys rūpintis tinkamu komponenčių išdėstymu. Tokiu atveju teks naudotis metodu
 setBounds(int x, int y, int plotis, int aukštis);
  
Metodo parametrai x ir y reiškia komponentės viršutinio kairiojo kampo koordinatę, o parametrai plotis ir aukštis - tiesiog komponentės plotį ir aukštį. Taigi kvadratinį mygtuką mygt su kraštinę lygia 50 pt į lango viršutinį kampą galime padėti taip:
mygt.setBounds(0,0,50,50); 
Galime nurodyti ne tik komponentės vietą ir matmenis. Yra daug visoms komponentėms bendrų metodų, kuriais galime keisti jų savybes. Pavyzdžiui, norimas komponenčių fono ir teksto spalvas galime nustatyti panaudoję metodus
 setBackground(Color c);
 setForeground(Color c);
 
Skliausteliuose nurodyta, kad naudojantis šiais metodais reikia nurodyti parametrą c, kurio reikšmė - norima spalva. Panagrinėkime sudėtingesnį komponenčių išdėstymo programos lange būdą. Idėja tokia: dalį komponenčių išdėstome ant vienos lentos, kitą dalį - ant kitos. O po to - tas lentas ,,įkeliame" į pagrindinį langą. Kiekvienai lentai galima naudoti savą išdėstymo objektą. Tos ,,lentos" - tai nauji objektai Panel. Geriausia visa tai parodyti pavyzdžiu: ant vienos ,,lentos" išdėstysime vieną mygtukų grupę, ant kitos - kitą, o tas ,,lentas" sudėsime pasinaudoję BorderLayout išdėstymu. Be to mygtukams spalvinti panaudosime dvi spalvas.
Komponenčių grupavimas ir išdėstymas

Atsisiųskite programos tekstą.

Į pradžią

Įvykiai ir reagavimas į juos


Dar kartą: objektai generuoja įvykius, juos reikia registruoti ir atitinkamai reaguoti. Taigi turime aptarti: kokiuos įvykius generuoja objektai, kas tuos įvykius registruoja, kokie yra reagavimo metodai.
Komponentė Įvykis Kada įvyksta Kas registruoja Reagavimo metodas
Button ActionEvent Kai paspaudžiame mygtuką ActionListener actionPerformed()
TextField ActionEvent
Kai baigiame redaguoti tekstą
ActionListener actionPerformed()
Checkbox ItemEvent Kai uždedame ar nuimame žymeklio ,,varnelę" ItemListener itemStateChanged()
CheckboxMenuItem ItemEvent Kai uždedame ar nuimame žymeklio ,,varnelę" ItemListener itemStateChanged()
List 1.ActionEvent
2. ItemEvent
1.Kai dukart spragtelime sąrašo elementą
2. Kai pasirenkame sąrašo elementą ar atsisakome pasirinkimo.
ActionListener
ItemListener
actionPerformed()
itemStateChanged()
Choice ItemEvent Kai pasirenkame išsiskleidusio sąrašo elementą ItemListener itemStateChanged()
Išvardijome toli gražu ne visus įvykius. Pavyzdžiui, visos komponentės gali generuoti tuos pačius ,,pelės" įvykius, kurie įvyksta, kai pelę patraukiame, paspaudžiame ar atleidžiame pelės mygtuką... Tačiau apie šiuos ir kitus įvykius vėliau.
Generuojami įvykiai irgi yra objektai. Jie turi savo metodus. Vienas iš svarbiausių metodų - getSource(). Jis nurodo, kuri komponentė generavo įvykį. Įvykių ir reagavimo į juos pavyzdys - nesudėtingas įskiepis, kuriame naudojami keturi mygtukai. Į įvykius reaguojama pakeičiant mygtukų spalvą.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class MygtIvyk extends Applet implements ActionListener{
Button [] mygt= new Button [4];
public void init() {
setLayout(new GridLayout(2,2));

String [] antr ={"Pirmas", "Antras","Trecias", "Ketvirtas"};
		
for (int i=0; i<4; i++){
mygt[i]=new Button(antr[i]);
mygt[i].addActionListener(this);
add(mygt[i]);
}}

public void actionPerformed(ActionEvent ivyk)
{
if (ivyk.getSource()==mygt[0]) 
mygt[0].setBackground(Color.white);
if (ivyk.getSource()==mygt[1]) 
mygt[1].setBackground(Color.pink);
if (ivyk.getSource()==mygt[2]) 
mygt[2].setBackground(Color.red);
if (ivyk.getSource()==mygt[3]) 
mygt[3].setBackground(Color.blue);
}}
Pažiūrėkite, kaip veikia.    
Atsisiųskite programos tekstą.

   Į pradžią

Button, TextField, TextArea


Mygtukus jau ne kartą naudojome savo programose. Prisiminkime, kad yra du mygtukų konstruktoriai:
   Button()
   Button(String Užrašas)
   
Paminėsime dar du metodus: vieną naudojame, norėdami gauti mygtuko užrašą, kitą - norėdami suteikti mygtukui užrašą. Šių metodų sintaksė tokia:
  public String getLabel()
  public void setLabel(String Užrašas)
  
Teksto laukus ir sritis taip pat jau naudojome.
TextField konstruktoriai:
  TextField()
  TextField(String Pradinis_tekstas)
  TextField(int plotis)
  TextField(String Pradinis_tekstas, int plotis)
  
Konstruktorių parametrų prasmė, tikiuosi, aiški iš pavadinimų. Dažniausiai naudojamės šiais TextField metodais:
public void setText(String Užrašomas_tekstas)
public String getText()
Antrąjį metodą naudojame, norėdami tekstą iš lauko priskirti String tipo kintamajam, kad po to galėtume atlikti mums reikalingus veiksmus.
Kai reikia įvesti ar išvesti daug teksto eilučių, vietoje TextField galime naudoti komponentę TextArea.
TextArea konstruktoriai
TextArea()
TextArea(String Pradinis_tekstas)
TextArea(int eilučių_sk, int stulpelių_sk)
TextArea(String Pradinis_tekstas, int eilučių_sk, int stulpelių_sk )
TextArea(String Pradinis_tekstas, int eilučių_sk, int stulpelių_sk, peržiūra)
Penktajame konstruktoriuje parametro peržiūra vietoje galime naudoti šiuos žodžius:
 SCROLLBARS_BOTH, SCROLLBARS_VERTICAL_ONLY, SCROLLBARS_HORIZONTAL_ONLY, SCROLLBARS_NON
Jie nurodo, kurias peržiūros juostas reikia pridėti. Komponentė TextArea kaip ir TextField turi metodus getText() ir setText(). Norėdami pridėti dar vieną eilutę prie teksto srityje užrašyto teksto galime naudoti metodą
 
append(String Nauja_eilutė)

Į pradžią

Checkbox, CheckboxGroup


Žymeklio Checkbox konstruktoriai:
Checkbox()
Checkbox(String Užrašas)
CheckBox(String Užrašas, boolean padėtis)
Jeigu parametro "padėtis" reikšmė yra true, tai sukuriamas žymeklis jau su pažymėta ,,varnele".
Metodai:
public boolean getState()
public boolean setState(boolean padėtis)
public String getLabel()
public void setLabel(String Užrašas)
Iš pavadinimų aišku, kad šiais metodais galime sužinoti ir keisti žymeklių užrašus bei padėtis: pažymėta ar nepažymėta (true ar false).
Iš žymeklių galime sukurti žymeklių grupę CheckBoxGroup. Kadangi tik vienas žymeklis šioje grupėje gali būti pažymėtas, tai grupė veikia kaip jungiklis, įjungiantis vieną iš kelių padėčių.
CheckBox konstruktorius
CheckBoxGroup()
sukuria tuščią grupę, į kurią žymekliai įtraukiami naudojantis specialiu CheckBox konstruktoriumi
CheckBox(String Žymė, boolean padėtis, CheckBoxGroup grupės_vardas)
Metodai, kuriuos naudojame, norėdami sužinoti, kuris žymeklis pažymėtas ar norėdami pažymėti reikalingą žymeklį:
public CheckBox getSelectedBox()
public void setSelectedCheckBox(CheckBox žymeklio_vardas)
Štai vienas aptartųjų komponenčių panaudojimo programoje pavyzdys. Programoje panaudosime vieną žymeklį jng ir žymeklių grupę gr. Šia grupe galėsime naudotis tik tada, kai ,,varnelę" uždėsime žymeklyje jng. Grupės žymekliais valdysime lango fono spalvą.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Zymekliai extends Applet implements ItemListener{

Panel p;
CheckboxGroup gr;
Checkbox jng;
Checkbox zym [];
	
public void init() {
setLayout(new BorderLayout());
gr = new CheckboxGroup();
zym= new Checkbox [4];
String [] antr ={"Mėlyna", "Magenta","Žalia", "Balta"};
p = new Panel();
		
for (int i=0; i<4; i++){
zym[i] = new Checkbox(antr[i], gr, false);
zym[i].addItemListener(this);
p.add(zym[i]);
}
p.setVisible(true);
p.setEnabled(false);
add("North",p);
jng = new Checkbox("Leisti naudotis žymeklių grupe", false);
jng.addItemListener(this);
add("South", jng);
}
public void itemStateChanged(ItemEvent ivyk)
{
if (jng.getState()){p.setBackground(Color.pink); p.setEnabled(true);}
else {p.setBackground(Color.white);p.setEnabled(false);}
if (zym[0].getState()) setBackground(Color.blue);
if (zym[1].getState()) setBackground(Color.magenta);
if (zym[2].getState()) setBackground(Color.green);
if (zym[3].getState()) setBackground(Color.white);
}
}
Pažiūrėkite, kaip veikia.    
Atsisiųskite programos tekstą.

Į pradžią

List ir Choice

List konstruktoriai
  List()
  List(int eiluciu_skaicius)
  List(int eiluciu_skaicius, boolean pasirinkimas) 
  
Konstruktoriuje galime nurodyti, kiek eilučių turi turėti sąrašas. Jeigu sąrašą sukonstravome naudodami vieną iš pirmųjų konstruktorių, jame galima pasirinkti tik vieną įrašą. Jeigu reikalingas sąrašas su daugelio elementų pasirinkimo galimybe, naudokite trečiąji konstruktorių vietoje antrojo parametro nurodę true . Darbui su sąrašais yra daug naudingų metodų. Dalį jų išrašysime lentelėje. Elemento vieta metodų aprašyme nurodoma kintamuoju index . Sąrašo elementai numeruojami pradedant nuo nulio.
public void add (String elementas) Į sąrašą įtraukia nurodytą elementą
public void add (String elementas, int index) Į sąrašą įtraukia nurodytą elementą nurodytoje pozicijoje
public int getItemCount( ) Nurodo, kiek elementų yra sąraše
public void remove(String elementas) Pašalina iš sąrašo nurodytą elementą
public void remove(int index) Pašalina iš sąrašo elementą, kurio numeris nurodytas
public void removeAll( ) Pašalina visus sąrašo elementus
public void replaceItem(String naujas_elementas, int index) Pakeičia vieną elementą kitu
public String getSelectedItem( ) Perduoda pasirinktą sąrašo elementą
public int getSelectedIndex( ) Perduoda pasirinkto elemento numerį
public String [ ] getSelectedItems() Sudaro masyvą iš pasirinktų elementų
public int [ ] getSelectedIndexes() Sudaro masyvą iš pasirinktų elementų numerių
public boolean isIndexSelected(int index) Perduoda reikšmę true, jei elementas, kurio numeris yra nurodytas, buvo pasirinktas
public String getItem(int index) Perduoda sąrašo elementą, kurio numeris nurodytas
public String [ ] getItems() Sudaro masyvą iš pasirinktų elementų numerių
Išsiskleidžiančiam sąrašui sukurti yra vienintelis konstruktorius
Choice ()
Konstruktorius sukuria tuščią sąrašą. Elementus į šį sąrašą galime įtraukti metodu add(String elementas). Šį metodą naudojame ir List elementams įtraukti. Apskritai dauguma išvardytų lentelėje List metodų tinka ir Choice sąrašui. Suprantama, sąrašui Choice negalima naudoti tų metodų, kurie susiję su kelių elementų pasirinkimu.
Darbui su sąrašais iliustruoti parašėme programą, kurioje panaudojome du List sąrašus. Ką ši programa daro, tikriausiai suprasite, panagrinėję paveikslėlį. O panagrinėję žemiau pridėtą programėlės tekstą, galėtumėte išmokti naudotis sąrašo List metodais. Jeigu savo programoje norėsite naudoti ne List bet Choice tipo sąrašą - įvykiams registruoti naudokite ItemListener !
import java.awt.*;
import java.awt.event.*;

class Sarasai extends Frame  implements ActionListener{
List desimtys, skaiciai;
Button suma;
TextField laukas;	
	
public Sarasai() {
setSize(200,500);  
setTitle("Sąrašai "); 

setLayout(new GridLayout(6,1));
desimtys =new List(6);
desimtys.add("1-10");
desimtys.add("11-20");
desimtys.add("21-30");
desimtys.add("31-40");
desimtys.add("41-50");
desimtys.addActionListener(this);
add(desimtys);

skaiciai = new List(10, true);
skaiciai.addActionListener(this);
add(ants); add(skaiciai);	
suma = new Button("Suma");
 suma.addActionListener(this); 
 add(suma);
laukas = new TextField(); add(laukas);
show();
 
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
} });
}

public void actionPerformed(ActionEvent ivykis )
{if (ivykis.getSource()==desimtys)
itraukti(desimtys.getSelectedIndex());
if (ivykis.getSource()==suma) sumuoti();}

public void itraukti (int d){
skaiciai.removeAll(); int sk=d*10;
for (int i=1; i<11;i++ ) {sk ++; skaiciai.add(""+sk);}}

public void sumuoti(){
if (skaiciai.getSelectedItems().length ==0)
{laukas.setText("Nieko nepasirinkote, todėl nėra ką sumuoti"); return;}	
int s=0, viso=skaiciai.getSelectedItems().length;
for  (int i=0; i<viso; i++ ) 
s=s+Integer.parseInt(skaiciai.getSelectedItems()[i]);
laukas.setText("Pasirinkta skaičių " + viso+",  jų suma lygi "+ s);}

public static void main(String args[]) { new Sarasai();}
}
Atsisiųskite programos tekstą.

Į pradžią

Canvas

Klasę Canvas naudojame, kai programos lange reikia patalpinti daug grafikos. Ši klasė turi vieną metodą paint(), kurį reikia pritaikyti savo reikmėms. Pakartotinai ši piešimo metodą iškviečiame komanda repaint().
Darbą su šia komponente iliustruosime programa, kurioje naudojamos dvi drobės, o piešimas jose valdomas dviem mygtukais. Spalvos parenkamos iš sąrašo.
import java.awt.*;
import java.awt.event.*;

class DviDrobes extends Frame implements ActionListener{

Panel p1, p2;
List spalvos;
Button m1, m2;
Drobe dr1, dr2;	 
Color  spalv []={Color.black, Color.red, 
Color.blue, Color.yellow, Color.gray, Color.orange, Color.pink};
  
public DviDrobes() {
int w, h;	
setSize(400,440);
setTitle("Dvi drobės viename lange");

setLayout(new BorderLayout());
w=getSize().width;
h=getSize().height;

p1= new Panel();
p1.setLayout(new GridLayout(3,1));

spalvos = new List ();
spalvos.add("Juoda");
spalvos.add("Raudona");
spalvos.add("Mėlyna");
spalvos.add("Geltona");
spalvos.add("Pilka");
spalvos.add("Oranžinė");
spalvos.add("Rausva");


spalvos.addActionListener(this);
p1.add(spalvos);
m1= new Button("Piešti pirmoje drobėje");
m1.addActionListener(this);
p1.add(m1);		

m2= new Button("Piešti antroje drobėje");
m2.addActionListener(this);
p1.add(m2);	
add("West",p1);

p2 = new Panel();
p2.setLayout(new GridLayout(2,1));
dr1 = new Drobe();
dr2 = new Drobe();
p2.add(dr1);
p2.add(dr2);
add("Center",p2);
spalvos.select(0);
show();
		
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
} });}


public void actionPerformed(ActionEvent e) {
if (e.getSource()==m1)
{dr1.sp=spalv[spalvos.getSelectedIndex()];dr1.repaint();	}
 if (e.getSource()==m2)
{dr2.sp=spalv[spalvos.getSelectedIndex()];dr2.repaint();	}
 }

public static void main(String args[]) {
new DviDrobes();}
}
class Drobe  extends Canvas  {
Color sp=Color.white;
public void paint (Graphics g)
{g.drawRect(0,0,200,200);
g.setColor(sp); 
g.fillRect(50,50, 100,100);
}}
Atsisiųskite programos tekstą.

Į pradžią

Įvykiai, kuriuos sukelia pelė

Jau minėjome, kad šmižinėdama tarp programos komponenčių, įvykius gali sukelti pelė. Pavyzdžiui, įvykis gali būti generuotas, kai komponentę spragtelime pelės mygtuku arba tiesiog pelė ,,užropoja" ant komponentės. Pelės įvykiams registruoti yra du objektai: MouseListener ir MouseMotionListener Pirmasis reaguoja į pelės mygtuko spragtelėjimą, spaudimą ir kt., antrasis generuoja įvykį, kai pelės ženklas sujuda arba traukiamas spaudžiant mygtuką. Naudojant MouseListener tenka apibrėžti reagavimo į penkias situacijas metodus:
Įvykis MouseListener metodas
Pelės mygtuko spragtelėjimas public void mouseClicked(MouseEvent ivykis)
Pelė komponentės teritorijoje public void mouseEntered(MouseEvent ivykis)
Pelė pabėgo iš komponentės teritorijos public void mouseExited(MouseEvent ivykis)
Paspaustas pelės mygtukas public void mousePressed(MouseEvent ivykis)
Pelės mygtukas atleistas public void mouseReleased(MouseEvent ivykis)

MouseMotionListener reaguoja tik į dvi situacijas
Įvykis MouseMotionListener metodas
Pelė juda public void mouseMoved(MouseEvent ivykis)
Pelė ,,velkama" public void mouseDragged(MouseEvent ivykis)
Pelės įvykių programose naudojimui iliustruoti parašėme nesudėtingo žaidimo įskiepį. Kažkur įskiepio lange paslėptas taikinys. Jis kliudomas, kai virš jo spragtelimas pelės mygtukas. Jeigu taikinys nekliudomas, programa nurodo, koks atstumas iki jo.
Mes reaguojame tik į vieną situaciją: kai paspaudžiamas pelės mygukas. Tačiau yra eilutės, apibrėžiančios ir kitus MouseListener metodus, tik atitinkamų veiksmų aibės yra tuščios.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Taikinys extends Applet 
implements ActionListener, MouseListener {
int xt, yt, x, y, nr, d, w, h, sekme; 
TextField txt = new TextField(); 
Button mygt;
public void init() {
setLayout (new BorderLayout());	
mygt = new Button("Pradėti");
mygt.addActionListener(this);
add("North", mygt);
add("South",txt);
w=getSize().width-20;
h=getSize().height-20;
addMouseListener(this);
}

public void actionPerformed (ActionEvent ivykis)
{xt= (int)(Math.random()*w+10);
yt= (int)(Math.random()*h+10);
nr=0; sekme=0;
repaint();}

public void mouseClicked(MouseEvent peles_ivykis){
x=peles_ivykis.getX(); y=peles_ivykis.getY();
tikslas(x,y);	}
	
public void mousePressed(MouseEvent peles_ivykis){}
public void mouseReleased(MouseEvent peles_ivykis){}
public void mouseEntered(MouseEvent peles_ivykis){}
public void mouseExited(MouseEvent peles_ivykis){}
	

public void tikslas(int u, int v)
{d= (int) (Math.sqrt((x-xt)*(x-xt)+(y-yt)*(y-yt) ));
if (d<10) {nr++;
txt.setText(""+nr+"-uoju bandymu pataikėte į tikslą"); sekme=1; repaint();} 
else {nr++; txt.setText("Atstumas iki tikslo lygus "+d);}
}
  
public void paint(Graphics g) {
g.setColor(getBackground());
g.fillRect(0,0,w+20, h+20);
if (sekme ==1){ g.setColor(Color.red);
g.fillOval(xt, yt, 10, 10);}
}
}

Pažiūrėkite, kaip veikia.     
Atsisiųskite programos tekstą.

Užduotis

Parašyti programą (ne įskiepį!), kurioje būtų panaudota dalis AWT (arba Swing) komponenčių, sukurti reagavimo į įvykius su komponentėmis metodai.
AWT komponentės

Pasiūlymai

1. Suprogramuokite ,,lenktynių" modelį. Sukurkite drobę (Canvas), kurioje bus ,,piešiamas" lenktynių vaizdas. Lenktyninkus vaizduokite kokias nors grafiniais elementais (arba paveikslėliais). Lenktyninkų skaičių, spalvas turi būti galima keisti. Lenktynes valdykite mygtuku. Paspaudus mygtuką, visi dalyviai pajuda per atsitiktinį atstumą į priekį (drobė perpiešiama). Nugali tas, kas pirmas pasiekia finišo liniją.

2. Įkelkite į drobę žemėlapį (paveikslėlį). Suprogramuokite reagavimo į pelės įvykius metodus taip, kad spragsint pelės mygtukais būtų galima matuoti atstumus nuo taško iki taško, t.y. skaičiuoti laužčių ilgius. Padarykite taip, kad būtų galima pasirinkti vieną žemėlapį iš kelių. Skaičiavimo rezultatus rašykite teksto srityje.

3. Sukurkite programą lygtims spręsti naudojantis grafikais. Turi būti galimybė pasirinkti kelias funkcijas ir nubrėžti jų grafikus drobėje. Spragtelėjus pelės mygtuką dviejų grafikų susikirtimo taške, turi būti užrašomos šio taško koordinatės. Turi būti suprogramuota, kaip patikrinti rastojo sprendinio tikslumą (skaičiuojant funkcijų reikšmes).

4. Suprogramuokite braižymo lentą: joje pasirinktinai galima braižyti kampus, elipses, apskritimus. Taškus žymime spragteldami pelės myguku. Turi būti galimybė pasirinkti spalvas.

5. Suprogramuokite spalvų tyrinėjimo įrankį. Į pasirinkimo sąrašą įtraukite keletą spalvų. Kai spalva pasirinkta, sukurkite galimybę keisti vieną (ar 2, ar 3) jos parametrus - iki nurodytos reikšmės ir dažyti pakeista spalva juostelės dalį. Taigi gausite juostelę, kurios spalva tolydžio kinta. Sukurkite galimybę spragtelėjus šios juostelės tašką gauti tos vietos spalvos parametrus.

6. Ką turėtų veikti jūsų programa - sugalvokite patys. Kad būtų lengviau pradėti - pasižiūrėkite į pavyzdžius.


Užduoties vertinimas: už kiekvieną panaudotą komponentę - 3 taškai. Tačiau jeigu naudosite kelias tos pačios rūšies komponentes (pavyzdžiui, kelis mygtukus) - daugiau taškų negausite. Už sukurtą metodą - 5 taškai pridedant ,,premijinius" taškus už sudėtingumą ar originalumą. Jeigu naudosite ne AWT bet SWING paketo komponentes - už kiekvieną komponentę gausite po 4 taškus.

Štai dar keletas programų pavyzdžių:
Galite atsisiųsti sukompiliuotas programas (pvz.zip).