#02 — interakcja z użytkownikiem

By 21 August 2014 February 22nd, 2016 Kurs Javy

Praw­ie zawsze pro­gram w jak­iś sposób dokonu­je inter­akcji z użytkown­ikiem — prosi o wprowadze­nie jakichś danych lub wyświ­et­la jakieś infor­ma­c­je. W tej lekcji dowiemy się jak obsługi­wać najprost­szą inter­akcję — za pomocą linii komend.

Linia komend (zwana też wier­szem pole­ceń) to tek­stowy tryb obsłu­gi kom­put­era. Zan­im w kom­put­er­ach pojaw­ił się tryb graficzny, pozwala­ją­cy obsługi­wać go za pomocą m.in. mysz­ki, pod­sta­wowym sposobem obsłu­gi kom­put­era był tryb tek­stowy. Do tej pory jest on wyko­rzysty­wany w niek­tórych aplikac­jach, także my z niego sko­rzys­tamy na początku.

Lekcja

Pierwszy program

Żeby móc zacząć pisać kod i sprawdzać jak będzie dzi­ałał, musimy powiedzieć Javie że to, co pisze­my może bezpośred­nio uru­chomić. Szczegółowo omówimy to w kole­jnych lekc­jach, ale na tą chwilę to, co musisz wiedzieć, to to, że wystar­czy dodać do naszej klasy metodę o syg­naturze pub­lic sta­t­ic void main(String[] args), a w jej ciele zaim­ple­men­tować to, co chce­my zro­bić. Ponieważ omówie­nie i szczegółowy opis pojawi się na blogu później, zain­tere­sowanych odsyłam do krótkiego opisu z wyjaśnieni­a­mi w języku ang­iel­skim. A u nas na tę chwilę wer­s­ja instant — frag­ment kodu:

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Aby przy­pom­nieć sobie, jak uru­chomić nasz pro­gram, możesz zajrzeć na stronę o narzędzi­ach i środowisku.

Pojaw­ia się tutaj pier­wszy niez­nany nam ele­ment, prze­jdźmy zatem do wyjaśnienia, co on robi.

Wypisywanie danych dla użytkownika

Pod­sta­wowym sposobem na wyp­isy­wanie czegoś w kon­soli są dwie metody: System.out.print(..) oraz System.out.println(..) . Jedyną różnicą jest to, że dru­ga z nich wyp­isu­je też znak koń­ca linii — tzn. kur­sor w kon­soli prze­chodzi do następ­nego wier­sza zaraz po wyp­isanym tekście.

Aby wyświ­etlić użytkown­ikowi infor­ma­cję “Podaj imię” wystar­czy zapisać w naszym pro­gramie polecenie:

System.out.print("Podaj imię: ");

Spowodu­je to wyświ­etle­nie powyższego pyta­nia w oknie kon­soli, a znak zachę­ty pojawi się na lewo od naszego pytania.

Chcąc wyświ­etlić dodatkowo wartość pewnej zmi­en­nej, może­my po pros­tu ją ‘dodać’ (dokon­ać konkate­nacji). Należy jed­nak uważać, ponieważ nie każdy obiekt może­my w ten sposób dodać lub to, co zostanie wyświ­et­lone będzie niezrozu­mi­ałe dla użytkownika.

Integer zmienna = 1;
System.out.print("Wartość zmiennej: " + zmienna);

Tutaj uwa­ga natu­ry tech­nicznej: uży­wanie pol­s­kich znaków w kon­soli jest prob­lematy­czne, ponieważ dochodzi tutaj kwes­t­ia kodowa­nia znaków, które jest różne w różnych sys­temach (dla zain­tere­sowanych — w sys­temach Win­dows uży­wamy cp1250). Oczy­wiś­cie Java daje narzędzia pozwala­jące ten prob­lem rozwiązać, ale tem­aty­ka ta jest poza obszarem tego kur­su, a w dal­szych eta­pach wczy­ty­wanie danych będziemy real­i­zowali w bardziej kon­trolowany sposób. Dlat­ego kwest­ię pol­s­kich znaków w oknie kon­soli w ramach tego kur­su zignorujemy.

Jeśli chodzi o wyświ­etle­nie w oknie kon­soli, to jest pod­sta­wowy sposób i wszys­tkie inne korzys­ta­ją z niego ostate­cznie. Oczy­wiś­cie ist­nieje wiele możli­woś­ci for­ma­towa­nia wyjś­cia, wyświ­et­la­nia liczb z określoną pre­cyzją, dat w określonym for­ma­cie, ale praw­da jest taka, że niewiele aplikacji posi­a­da inter­fe­js tek­stowy, z którego korzys­ta­ją użytkown­i­cy. Nam będzie to potrzeb­ne do nau­ki kilku kole­jnych ele­men­tów po czym zajmiemy się bardziej współczes­ny­mi sposoba­mi na inter­akcję z użytkown­ikiem. Z tego powodu, poprzes­taniemy na tej pod­sta­wowej wiedzy. Zain­tere­sowanych odsyłam np. do doku­men­tacji klasy For­mat­ter, która jest jed­nym z prost­szych a jed­nocześnie potężnych narzędzi służą­cych do for­ma­towa­nia wyjś­cia w języku Java.

Uproszczony schemat jak wypisujemy informacje dla użytkownika

Uproszc­zony schemat jak wyp­isu­je­my infor­ma­c­je dla użytkownika

Wczytywanie danych od użytkownika

Jeśli chodzi o wczy­ty­wanie danych, mamy zde­cy­dowanie więcej możli­woś­ci i opcji. Pod­sta­wowy sposób to odczyt bajt po baj­cie (czyli znak po znaku) i następ­nie skle­janie z tego infor­ma­cji, które chce­my wczy­tać od użytkown­i­ka. Jest to rozwiązanie bard­zo elasty­czne, ale spraw­ia­jące równie dużo kłopotów, szczegól­nie początku­ją­cym pro­gramis­tom. Sko­rzys­tamy więc z innej klasy, którą ofer­u­je nam Java — Scan­ner. Klasa ta jest bard­zo uni­w­er­sal­na, pozwala nam na obsługę kon­soli, plików, stru­mieni (czyli np. danych pobier­anych z inter­ne­tu czy streamin­gu video), wyko­rzys­tamy tylko jej pod­sta­wowe funkcjon­al­noś­ci. Ale zachę­cam do ekspery­men­tów, nie ugryzie (w prze­ci­wieńst­wie do Tes­li na diecie) :)

Przede wszys­tkim zdefini­u­jmy w naszej klasie pole o nazwie sc i typ­ie Scan­ner (a umiemy już to robić):

static Scanner sc = new Scanner(System.in);

To co robi ta lin­ij­ka, to deklaru­je pole o nazwie sc (nazwa oczy­wiś­cie jest dowol­na, ważne żeby uży­wać jej poprawnie w odpowied­nich miejs­cach w kodzie) i przyp­isu­je do niego nowy obiekt typu Scan­ner, który jako źródło danych wyko­rzys­tu­je System.in (tzw. stan­dar­d­owe wejś­cie — stąd może­my uzyskać to, co użytkown­ik wpisze w konsoli).

Następ­nie doda­je­my do tej klasy metodę (to też umiemy już robić), której będziemy uży­wać za każdym razem, kiedy będziemy potrze­bowali wczy­tać dane od użytkown­i­ka. Meto­da ta wyglą­da następująco:

public static String getUserInput() {
    return sc.nextLine();
}

Meto­da ta zwraca następ­ną lin­ijkę z wejś­cia (czyli tego co wpisał użytkown­ik) za każdym razem kiedy zostanie wywołana. Wyko­rzys­tu­je do tego metodę nextLine z klasy Scan­ner (jeśli chce­my wcześniej sprawdz­ić, czy użytkown­ik wpisał cokol­wiek wcześniej i zabez­pieczyć się przed sytu­acją ‘zaw­ieszenia’ aplikacji, moż­na użyć metody has­NextLine() z tejże klasy — zachę­cam do wyszuka­nia przykładu lub poekspery­men­towa­nia samodzielnie).

Uwa­ga: meto­da Scanner.nextLine ‘bloku­je się’ dopó­ki użytkown­ik nie wpisze czegoś i nie zatwierdzi klaw­iszem ‘Enter’. Oznacza to, że aplikac­ja będzie czekała aż użytkown­ik nie wpisze czegoś i nie zatwierdzi tego enterem. Dopó­ki to się nie stanie, żad­na dal­sza akc­ja nie zostanie wykonana.

Jeśli dodal­iśmy opisane wyżej ele­men­ty, w dowol­nym miejs­cu naszej klasy może­my napisać np:

System.out.print("Podaj imię: ");
String imieWczytaneOdUzytkownika = getUserInput();

To tyle :) I tak, to naprawdę jest tak proste, tutaj nie ma haczyków ;)

Uproszczony diagram obrazujący wczytywanie danych od użytkownika

Uproszc­zony dia­gram obrazu­ją­cy wczy­ty­wanie danych od użytkownika

Dwa słowa o tym, czym jest ‘static’

Jak pewnie zauważyłaś, wszys­tkie ele­men­ty, które tworzyliśmy w kodzie były staty­czne — tzn poprzedza­l­iśmy je słówkiem ‘sta­t­ic’. Dzię­ki temu, możli­we było ich uży­cie w metodzie main (czyli głównej metodzie pro­gra­mu), bez koniecznoś­ci tworzenia nowego obiek­tu aplikacji. To, że meto­da lub pole jest staty­czne, oznacza, że jest one ‘włas­noś­cią’ klasy, a nie konkret­nej instancji obiek­tu. Dzię­ki temu nie ma potrze­by tworzenia nowego obiek­tu tylko po to, aby wywołać jakąś metodę. Kon­sek­wencją jest oczy­wiś­cie to, że takie metody nie mają dostępu do pól konkret­nych obiek­tów, a jedynie do innych pól i metod staty­cznych. W naszym przy­pad­ku nie stanowi to jed­nak prob­le­mu i jest drob­nym uproszcze­niem, które sto­su­je­my w kodzie.

Zadanie

Utwórz klasę inter­fe­js. Klasa ta powin­na być aplikacją (tzn. żeby moż­na było ją uru­chomić) i powin­na pytać o nastepu­jące elementy:

  • imię kota
  • opiekun

Oraz zapisy­wać je w utwor­zonym na początku dzi­ała­nia pro­gra­mu obiek­cie kot­ka (jes­li nie pamię­tasz jak to zro­bić, zajrzyj do lekcji #01, gdzie mówimy o setterach).

Rozwiązanie

Przeglądaj kodPobierz ZIP

Rozwiąza­nia do lekcji są dostęp­ne w ser­wisie GitHub — użyj przy­cisków po prawej aby pobrać lub prze­jrzeć kod do tej lekcji. Jeśli masz wąt­pli­woś­ci, jak posługi­wać się Git’em, instrukc­je i lin­ki zna­jdziesz w naszym wpisie na tem­at Git’a.

2

Licencja Creative Commons

Jeśli uważasz powyższą lekcję za przy­dat­ną, mamy małą prośbę: pol­ub nasz fan­page. Dzię­ki temu będziesz zawsze na bieżą­co z nowy­mi treś­ci­a­mi na blogu ( i oczy­wiś­cie, z nowy­mi częś­ci­a­mi kur­su Javy). Dzięki!