Uvod u programiranje

Maja Čić


Praćenje događaja s tipkovnice


Događaji ne počinju kao Java objekti. Događaje uzrokuju korisničke radnje koje otkriva operativni sistem računala. Kad korisnik pomiče miša ili pritisne tipku, sistem mora odlučiti što s podacima o korisnikovoj radnji. Kod rada s mišem, podaci najčešće idu prema elementu grafičkog korisničkog sučelja koji sadrži pokazivač miša. Ako je to sučelje Java komponenta, podaci se pretvaraju u JavaMouseEvent koji se obrađuje kroz Java objekt tipa KeyEvent.

Grafička korisnička sučelja (GUI) koriste ideju ulaznog fokusa da bi odredila gdje će poslati podatke o događaju s tipkovnice. U jednom trenutku samo jedno sučelje na ekranu ima ulazni fokus i time je određeno mjesto gdje će biti poslani svi događaji s tipkovnice. Ako je taj element sučelja Java komponenta, tada podaci o događaju s tipkovnice postaju Java objekt tipa KeyEvent.

Dobro je dati korisniku neku informaciju o tome koja komponenta ima ulazni fokus (najčešće s tirajućim kursorom u prostoru za unos teksta ili svijetlo obojanim rubom komponente koja ima ulazni fokus).

Komponenta koja želi dobiti ulazni fokus može pozvati metodu requestFocus() definiranu u Component klasi. Samo pozivanje ove metode ne jamči da će komponenta i dobiti ulazni fokus. Isti zahtjev može postaviti i više komponenti, a samo jedna će ga dobiti. Ovu metodu treba pozivati samo u posebnim slučajevima, jer naglo prenošenje fokusa na drugu komponentu može ometati korisnika. Najčešće korisnik može dati fokus komponenti pritiskajući mišem na komponentu ili korištenjem tab tipke.

Neke komponente ne primaju ulazni fokus kad korisnik klikne na njih. Zato program mora prijaviti "slušač" miša da bi otkrio prtisak na tipku (klik). Kao odgovor na pritisak tipke, mousePressed() metoda treba pozvati requestFocus() za tu komponentu.

Da bi komponenta mogla promijeniti izgled kad ima ulazni fokus, mora postojati i način da komponenta zna da ima fokus. U Javi, objekti su obaviješteni o promjenama ulaznog fokusa preko događaja tipa FocusEvent. Objekt koji želi primiti obavijesti o promjenama fokusa mora implementirati FocusListener sučelje koje deklarira dvije metode:

	 public void focusGained(FocusEvent evt);
	 public void focusLost(FocusEvent evt);
	

Osim toga, metoda addFocusListener() mora biti korištena za postavljanje slušača događaja fokusa. Kad komponenta dobije ulazni fokus, poziva focusGained() metodu objekta koji je bio prijavljen s tom komponentom kao FocusListenerom. Kad izgubi fokus, poziva focusLost() metodu "slušača". Često, sama komponenta sluša događaje fokusa.

Sljedeći aplet ima logičku varijablu instance focussed, koja ima vrijednost true kad aplet ima fokus, a false kad izgubi fokus. Kad je vrijednost focussed true, metoda paint() iscrtava cijan rub oko paleta. Kad je vrijednost focussed false, prikazuje se poruka koja kaže korisniku da klikne na aplet da bi ga aktivirao. Kad aplet ima ulazni fokus, korištenjem strelica može se pomicati obojani pravokutnik po apletu, a boja pravokutnika se može promijeniti pritiskanjem R,G,B i K tipki.


U ovom primjeru aplet primjenjuje FocusListener sučelje. init() metoda apleta uključuje naredbu "addFocusListener(this);" kojom određuje da aplet sam sebe obavijesti o dobivanju ili gubitku fokusa. Metode focusGained() i focusLost() su jednostavne:

       public void focusGained(FocusEvent evt) {
               // aplet ima ulazni fokus
            focussed = true;
            repaint();  // iscrtaj ponovo s rubom boje cyan
       }
   
       public void focusLost(FocusEvent evt) {
               // aplet je izgubio ulazni fokus
            focussed = false;
            repaint();  // iscrtaj ponovo s rubom boje cyan
       }

Ovaj aplet također upravlja događajima koji se stvaraju kad korisnik koristi tipkovnicu. Ti događaji pripadaju klasi KeyEvent. Objekt koji želi primati obavijesti o KeyEvent događajima mora primjeniti KeyEvent sučelje i mora biti prijavljen kod komponente s addActionListener() metodom te komponente. KeyListener sučelje definira tri metode:

       public void keyPressed(KeyEvent evt);
       public void keyReleased(KeyEvent evt);
       public void keyTyped(KeyEvent evt);

Metoda keyTiped() se poziva kad se pritisne neka tipka (znak), tipka se određuje pozivanjem metode evt.getKeyChar(), koja vraća vrijednost tipa char. Ostale dvije metode, keyPressed() i keyReleased(), pozivaju se svaki put kad je neka tipka pritisnuta ili puštena, uključujući i posebne tipka poput shift ili strelica. Tipka može biti određena pozivanjem evt.getKeyCode() metode koja vraća int vrijednost koja je kod za tipku. Moguće vrijednosti ovog koda dane su konstantama u KeyEvent klasi. Na primjer tipke sa strelicama odgovaraju kodovima KeyEvent.VK_UP, KeyEvent.VK_DOWN, KeyEvent.VK_LEFT, i KeyEvent.VK_RIGHT, a kod za shift tipku je KeyEvent.VK_SHIFT. ("VK" = "Virtual Keyboard")

U istom apletu korištena je i keyTiped() metoda za odgovor na pritisak R,G,B ili K tipke:

       public void keyTyped(KeyEvent evt) {
          
            char ch = evt.getKeyChar();  // the character that was typed

            if (ch == 'B' || ch == 'b') {
               squareColor = Color.blue;
               repaint();
            }
            else if (ch == 'G' || ch == 'g') {
               squareColor = Color.green;
               repaint();
            }
            else if (ch == 'R' || ch == 'r') {
               squareColor = Color.red;
               repaint();
            }
            else if (ch == 'K' || ch == 'k') {
               squareColor = Color.black;
               repaint();
            }
   
         }  // end keyTyped()

i metoda keyPressed() definirana je za odgovor kad korisnik pritisne jednu od tipki strelica:

       public void keyPressed(KeyEvent evt) { 
                
            int key = evt.getKeyCode();  // kod tipkovnice za pritisnutu tipku
            
            if (key == KeyEvent.VK_LEFT) {
               squareLeft -= 8;
               if (squareLeft < 0)
                  squareLeft = 0;
               repaint();
            }
            else if (key == KeyEvent.VK_RIGHT) {
               squareLeft += 8;
               if (squareLeft > width - 6 - squareSize)
                  squareLeft = width - 6 - squareSize;
               repaint();
            }
            else if (key == KeyEvent.VK_UP) {
               squareTop -= 8;
               if (squareTop < 0)
                  squareTop = 0;
               repaint();
            }
            else if (key == KeyEvent.VK_DOWN) {
               squareTop += 8;
               if (squareTop > height - 6 - squareSize)
                  squareTop = height - 6 -squareSize;
               repaint();
            }

        }  // end keyPressed()

Na kraju, keyReleased() metoda potrebna za kompletiranje KeyListener sučelja definirana je ako prazna:

       public void keyReleased(KeyEvent evt) { 
            // prazna metoda, zahtijeva je KeyListener sučelje
       }

Kompletan izvorni kod ovog apleta je u datoteci KeyboardAndFocusDemo.java.




[ prethodna stranica | Početak ]