Opi
JAVA
Viimeinen muutos 04.10.2001
Kirjoittanut
Antti Veräjänkorva
Versio
1.4
JOHDANTO
Java kieli on hyvin kannattava kieli opiskella, koska sen käyttö Internetissä tulee varmasti yleistymään yhä enemmän. Nopeampien yhteyksien myötä tulee enemmän Java-appletteja. Javassa on hyviä ominaisuuksia ja ehkä kaikkein tärkein niistä on pohjasta riippumattomuus. Tämä on erittäin tärkeää varsinkin Internetissä, jossa käyttäjillä on eri laitteisto kokoonpanoja. Javan heikkous on sen hitaus, jonka pohjasta riippumattomuus tuo tullessaan. Hitautensa takia Java-appletteja ei juuri näy ’vielä’. Tämänkin takia Java on hyvin järkevä ohjelmointi vaihtoehto, koska silloin kun Javaa netissä aletaan käyttämään oikein toden teolla, on sinulla taito osata ohjelmoida kyseisellä kielellä.
Javalla voidaan ohjelmoida myös itsenäisiä ohjelmia. Nämä ohjelmat eivät siis tarvitse mikään laista Internetselainta (IE, Netscape), kuten Java-appletit. Varsinaista exe-tiedostoa ei Javan kääntäjä tee, mutta ohjelmien ajo onnistuu käskyllä ’Java [tiedoston nimi]’. Ohjelma on Javan tulkki, joka ajaa ohjelman. Appletteja voidaan siis ajaa internet selaimella, mutta myös ilman. Applet Viewer on ohjelma mikä simuloi internet selainta. Applet Viewer ohjelmalla onnistuu siis applettien ajo vai pitäisikö puhua testauksesta. Internetselaimessa moista käskyä ei tietenkään tarvita vaan appletti saadaan sivulle tietyllä koodiriveillä, jotka ovat seuraavat.
<applet
code="alkuun.class"
width="320"
height="240">
</applet>
Java ohjelmien lataamisesta ja kääntämisestä tulee vielä lisää tietoa, myöhemmin tutoriaalissa. Kyseiset operaatiot ovat yksinkertaisia ja helppoja.
Tutoriaalin oppien sisäistäminen ei edellytä aikaisempaa ohjelmointi kokemusta eikä kovinkaan kummoista tietokone osaamista. Tietokoneen käytön perusteet ja HTML kielen perusteet olisi kuitenkin hyvä osata.
1.0
Java alkeet vähän syvemmin
1.1
Kommentit
1.2
Muuttujat
1.3
Muuttuja tyypit
1.4
Operaattorit
1.5
Ehtolauseet
1.6
Toistolauseet
1.7
Taulukot
1.8
STRING-olio
2.0
Oliot
2.1
Mikä on olio
2.2
Kuinka olioita käytetään
2.3
Perintä
2.4
Koostaminen
2.5
Metodit
2.6
Rajapinnat
3.0
Käyttöliittymä
3.1
BUTTON
3.2
LABEL
3.3
SCROLLBAR
3.4
CHECKBOX
3.5
TEXTFIELD
3.6
TEXTAREA
3.7
CHOICE
3.8
LIST
4.0
Pohjat
eli Layout
4.1
PANEL
4.2
FLOWLAYOUT
4.3
CARDLAYOUT
4.4
BORDERLAYOUT
4.5
GRIDLAYOUT
4.6
GRIDBAGLAYOUT
5.0
Ikkunat
5.1
Ikkuna
5.2
Dialogi
6.0
Grafiikka
6.1
Erilaisia geometrisia kuvioita
6.2
Kuvat verkosta
7.0
Kiitos
Java kieli on helppo oppia, jos olet aiemmin koodannut vaikka C/C++ kielillä. Toki C/C++ kieletkin ovat helppo oppia Javan jälkeen. Ohjelmointi kokemusta ei kuitenkaan tarvita vaan kaikki asiat käydään läpi.
Tässä luvussa tehdään yksinkertainen Java ohjelma, applettina ja itsenäisenä ohjelmana. Luvussa tutustutaan myös ohjelmien kääntämiseen ja niiden ajamiseen.
Terve maailma
Jos olet lukenut jonkin ohjelmointi kirjan olet törmännyt riviin ’terve maailma tai hello world’. Seuraava harjoitus on varmasti eniten koodattu ohjelma maailmassa tai ainakin melkein. Ohjelman nimi on yllättäen terve maailma. Ohjelma tulostaa näyttöön rivin missä lukee terve maailma. Tässä ohjelmassa sanonta ’yksinkertainen on hienoa’ ei todellakaan pidä paikkaansa. Ohjelma on kyllä yksinkertainen, mutta säälittävän näköinen.
Ensimmäinen homma kun alat kirjoittaa ohjelmaa on, että avaat jonkin teksti editorin (notpad). Kirjoittaessasi koodia on muistettava pari asiaa.
- Älä käytä lihavointia tai muita tyyliominaisuuksia
- Älä vaihtele fontteja.
- Teksti pitää tallentaa ASCII muotoon.
- Java ohjelman tai appletin pääte on oltava java. Eli näin ohjelma.java
Siinä oli ensimmäiset asiat jotka pölähti mieleen.
Noin nyt kun tiedämme miten kirjaimia ruutuun hakataan niin voimmekin aloittaa pikku, pikku ohjelmamme.
/* Tämä ohjelma
kirjoittaa
ruutuun tekstin. */
import java.applet.*;
import java.awt.*;
public class text extends
Applet
{
public void
init() {
setBackground(Color.white);
}
public void
paint(Graphics g) {
g.drawString("Terve maailma !!!", 10, 10);
}
}
Yllä oleva koodi on appletti eli sitä on mahdollista käyttää vain selaimessa. Nyt kun ohjelma on valmis voimme tallentaa ja kääntää sen.
Ohjelma pitää tallentaa java pääteiseksi. Eli tallenna ohjelma terve.java nimiseksi.
Ohjelma käännettään niin, että avaat ensin Dos promptin ja kirjoitat seuraavan rivin.
Javac on Javan kääntäjä eli se tekee koodista toimivan ohjelman. Kuitenkin ennen kuin Javac voi toimia joka puolella konetta pitää autoexec.bat tiedostoa muuttaa. Autoexec.bat tiedosto on C-aseman juuressa. Kirjoita C-aseman juuressa edit autoexec.bat. Kirjoita sinne uusi rivi, joka kuuluu näin. SET PATH=Java kääntäjän paikka eli polku. Nyt olet valmis.
Koska odotat jo
malttamattomasti milloin näet mitä tuo ohjelma tekee niin näytetään se nyt. Tee
nettisivu. Eli avaa sama teksti editori jolla teet Java ohjelmia ja kirjoita
seuraavat rivit.
<HTML>
<HEAD>
<TITLE>Terve maailma</TITLE>
</HEAD>
<BODY>
<applet code="terve.class"
width="320"
height="240">
</applet>
</BODY>
</HTML>
Tallenna koodi nimellä index.html ja klikkaa syntynyttä tiedostoa.
Nyt nettisivulla on hieno Java-appletti. Eli sivulla lukee ’Terve maailma’.
Nyt katsotaan mitä kaikki tuo koodi oikein tarkoittaa. Tässä kannattaa nyt olla tarkkoina, koska tätä tietoa tullaan tarvitsemaan koko ajan kun Javaa ohjelmoidaan. Ensimmäiset rivit :
import
java.applet.*;
import java.awt.*;
Tarkoittavat
sitä, että luokalle tuodaan applet ja awt paketit. Rivien perässä on merkit
.*;. Javassa jokainen käsky loppuu ;-merkkiin ja .* tarkoittavat, että luokka
saa myös awt ja applet pakettien alipaketit. Paketit ovat joukko luokkia, jotka
on pakattu pakettiin.
Seuraavaksi rivi public class text extends Applet.
Rivi tarkoittaa, että luokan on julkinen ja luokan nimi on text. Luokka perii myös Applet luokalta.
{}-merkkejä Javassa käytetään koodin rajaamiseen (Pascal kielessä vastaavat ovat BEGIN JA END).
public void init() {.
Appletin suoritus alkaa tästä metodista. Se siis pitää
löytyä jokaisesta appletista. Metodissa määritellään taustaväri rivillä
setBackground(Color.white);
Piirto-metodi määritellään tällaisella rivillä public
void paint(Graphics g) {
Eli tuo tarkoittaa, että metodi on julkinen se ei palauta mitään arvoa ja luokan nimi on paint.
g.drawString("Terve maailma !!!", 10, 10);
Tämä rivi sitten tulosti tekstin appletiin, kohtaan X10 ja Y10.
Tuossa tulikin sitten kerrottua riviriviltä mitä koodi tarkoitti. No tällaista selitys muotoa ei tulla enää näkemään, koska se on mukavan työläs isommissa ohjelmissa.
Ja tuli vissiin luvattua, että tuosta rakennellaan myös itsenäinen versio eli.
public class text
{
public static void main(String args[])
{
System.out.println("Terve maailma !!!");
}
}
Koodi teki vähän niin kuin aiempikin, mutta vain DOS puolella. Eli selvitellään mitä koodi tarkoitti. Luokan määrittely onkin jo selvä. Metodissa sen sijaan löytyy uusi sana ja se STATIC. Tämä tarkoitta, että metodin jakavat kaikki luokan ilmentymät (tätä voi käyttää myös muuttujissa).
Seuraava outo rivi onkin tulostus rivi. Teksti tulostamiseen käytetään System.out luokan println()-metodia. Siinä se eikä varmasti ollut vaikeaa, mutta älä huoli kyllä se vaikea paikkakin vielä tulee vastaan.
Kun olet kääntänyt ohjelman voit ajaa sen kirjoittamalla DOS-promptiin seuraavaan komentorivin.
Nyt kun olemme ihastelleet hienoa ohjelmaamme riittävän pitkään niin siirrytään eteenpäin. Nyt pääsemme jo lukuun jossa on numerokin.
1.0
Java alkeet vähän syvemmin
Javassa on enemmänkin tiedettävää kuin aiemmin esitellyt jutut. Nyt tässä luvussa käydään läpi monia asioita mm.
- Kommentit
- Muuttujat
- Muuttuja tyypit
Kaikki mainitut asiat on oltava hallussa, jotta voisit rakennella kunnollisia sovelluksia. Kommenttien tärkeys on hyvin merkittävä varsinkin yritys ympäristössä.
Kommentti on koodin joukossa oleva teksti, mikä ei vaikuta tulevaan ohjelmaan. Vaan se on ainoastaan ohjelmoijaa varten oleva muistiteksti. Javan kääntäjä jättää automaattisesti moiset tekstit huomiotta eli niitä voi kirjoitella mielin määrin koodin sekaan.
// Kommentti
Yllä on yksi vaihtoehto tehdä kommentti. Merkit // ovat sen merkki, että kaikki noiden merkkien jälkeen, samalla rivillä oleva teksti on kommenttia.
On olemassa myös toinen mahdollisuus kommentin tekoon. Merkit /* */ sulkevat sisäänsä kommentin.
/* Tämä on
kommentti kahdella rivillä. */
Kommentteja kanttaa käyttää aina kun muistaa, jaksaa tai viitsii. Kommentoiminen on erittäin tärkeää varsinkin kun annat koodisi jollekin toiselle jatkokehitykseen. Toisen tekemää kommentoimatonta koodia on kamala lukea ja yrittää selvittää mitä se tekee missäkin.
Muuttujia käytetään tiedon tallentamiseen. Tieto pysyy muuttujassa (muistipaikka) niin kauan kunnes ohjelma on päällä tai jos muuttujan arvoa ei muuteta. Muuttujien käyttö on lähes pakollista kun koodaamme ohjelmia millä tahansa ohjelmointi kielellä. C kieltä tai C++ kieltä koodanneet voivat heittää hellät hyvästit osoitin muuttujille. Niitä ei meinaan vastaan tule.
Muuttujia on monia eri tyyppisiä. Eri tyyppisiin muuttujiin voidaan tallentaa vain muuttujan tyyppistä dataa. Seuraavassa Javan muuttuja tyypit :
Tyyppi |
Käyttötarkoitus |
Koko biteissä |
|
BYTE |
Tavuja |
8 |
|
SHORT |
Pieniin kokonaislukuihin |
16 |
|
CHAR |
Unicode-merkkejä |
16 |
|
INT |
Normaalit kokonaisluvut |
32 |
|
LONG |
Isot kokonaisluvut |
64 |
|
FLOAT |
Liukuluvut |
32 |
|
DOUBLE |
Tarkemmat liukuluvut |
64 |
Jos ihmettelet missä on STRING, niin se ei kuulu muuttujiin. Javassa merkkijonot ovat olioita. Tämän takia ei kannata loikata alas parvekkeelta, koska se ei vaikeuta asioita mitenkään. No STRING oliosta lisää myöhemmin.
Javassa on monenlaisia operaattoreita. Käymme nyt läpi nämä operaattorit. Javassa operaattoreita käytetään sijoittamaan arvoja, vertailuun, laskutoimituksiin, yms.
Sijoitusoperaattori
Tätä käytetään annettaessa muuttujalle arvo.
int = 0; // Tässä on
sijoitusoperaattori
Vertailuoperaattoreilla vertaillaan arvoja keskenään. Näitä käytetään useimmiten ehto- ja toistolauseissa. Operaattori palauttaa, myös TRUE arvon jos kyseinen tehtävä on tosi ja FALSE jos tehtävä ei ole tosi.
|
== |
Yhtä suuri |
|
!= |
Eri suuri |
|
< |
Pienempi kuin |
|
> |
Suurempi kuin |
|
<= |
Pienempi tai yhtä suuri
kuin |
|
>= |
Suurempi tai yhtä suuri
kuin |
Emme ole käyneet vielä läpi ehtolausetta, mutta siitä tulee nyt kuitenkin esimerkki.
public class luku
{
public static void main(String args[])
{
int luku =
10; // Sijoitusoperaattori =
if (luku
< 10) // Vertailuoperaattori <
System.out.println("Joo luku on pienempi kuin 10.");
else
System.out.println("Luku ei ole pienempi kuin 10.");
}
}
Näitä operaattoreita tarvitaan kun halutaan vertailla enemmän kuin kaksi lukua samassa ehtolauseessa. Äskeinen selitys oli kyllä niin heikko, että otamme heti pienen taulukon ja esimerkin.
|
! |
EI |
|
&& |
JA |
|
|| |
TAI |
Ja nyt sitten esimerkki aiheesta.
if ((luku < 10) && (luku > 0) // Looginen operaattori && eli JA.
Nämä operaattorit ovat tuttuja laskutoimituksia. Niitä tarvitaan luonnollisesti laskujen laskentaan. Eli operaattorit ovat seuraavat.
|
+ |
Yhteenlasku |
|
- |
Vähennyslasku |
|
/ |
Jakolasku |
|
* |
Kertolasku |
|
% |
Jakojäännös |
Muunto operaattoreita käytetään yleensä lisäämään tai vähentämään jostain luvusta 1. Yleinen käyttökohde on silmukat. Eli operaattorit ovat.
|
++ |
Lisää yksi |
|
-- |
Vähennä yksi |
|
-= |
Vähennä luku |
|
+= |
Lisää luku |
|
*= |
Kerro luku |
|
/= |
Jaa luku |
Näitä käytetään vain bittitasolla. Usein näkee bittioperaatioita käytettävän Grafiikka ohjelmoinnissa.
|
<< |
Siirrä vasemmalle |
|
>> |
Siirrä oikealle |
|
& |
JA |
|
| |
TAI |
|
^ |
XOR |
|
~ |
EI |
Bittitason operaattorit ovatkin sitten muita operaattoreita konstikkaampia. Näitä ei tarvita useinkaan ainakaan alussa. Eli se siitä. Käymme bittitason operaattoreita läpi tutoriaalissa ”Grafiikkaa Javalla”.
Ehtolauseita tarvitaan ohjelmissa yleensä paljon, koska niillä ohjaillaan paljolti ohjelman osien suoritus järjestystä. Niiden nimen omainen tarkoitus on katsoa onko ehto tosi vain ei.
Ehtolause Javassa on IF. Eli pieni esimerkki if lauseesta.
if (luku < 10)
// Koodia 1
else
// Koodia 2
IF-lause suorittaa koodia 1 kohdan jos ehto pitää paikkansa eli luku on pienempi kuin 10. ELSE tarkoittaa sitä, että jos ehto ei ole tosi niin tämän jälkeinen kohta suoritetaan eli koodia 2.
Suoritettavat koodit voidaan kirjoittaa {}-merkkien väliin jolloin merkkien välissä oleva koodi kuulu sille ehdolle jonka jälkeen merkit kirjoitetaan. Seuraavassa esimerkki tästä.
if (luku
< 10) {
// Koodia 1
// Koodia lisää
}
else {
// Koodia 2
// Koodia lisää
}
Ehtolauseen kanssa voidaan käyttää mukavasti loogisia operaattoreita kuten aiemmin näimme. Siltä varalta, että olet sen unohtanut tai epähuomiossa jättänyt huomiotta niin tässä esimerkki.
if ( (luku
< 10) && (luku > 0) ) {
// Koodia 1
// Koodia lisää
}
else {
// Koodia 2
// Koodia lisää
}
Näin saadaan helposti rajattua vaikka alueita ruudulta, mutta tästä lisää tutoriaalissa ”Grafiikkaa Javalla”. Ehtolauseita kannattaa treenata, koska ohjelman toiminta on pitkälti kiinni ehtolauseista. Lopuksi vielä pieni esimerkki.
public class luku
{
public static void main(String args[])
{
int luku =
10;
if (luku !=
10)
System.out.println("Joo luku on erisuuri kuin 10.");
else
System.out.println("Luku ei ole erisuuri kuin 10.");
}
}
Javassa on toinenkin ehtolause SWITCH. Tämä ehto lause ottaa numeron ja vertaa CASE kohdan perässä olevaan arvoon ja jos se täsmää niin suoritetaan koodia seuraavaan BREAK kohtaan saakka.
public class text
{
public static void main(String args[])
{
int luku=1;
switch (luku)
{
case 1:
luku = 50;
break;
case 2:
luku = 100;
break;
}
System.out.println("Luku on "+luku);
}
}
Toistolauseet ovat erittäin tärkeitä kaikissa ohjelmissa. Eivät ihan niin tärkeitä kuin ehtolauseet, mutta melkein. Toistolauseilla voidaan toistaa jotain ohjelman osaa halutun monta kertaa. Toistojen kanssa saadaan pienellä pähkinällä aikaan mielenkiintoisia juttuja.
Nyt kuitenkin pysymme ihan perusteissa ja teemme vain pikku toiston (loop), joka tulostaa ruutuun numerot 1:stä 10:neen. Ohjelma on hyvä harjoitus ja siinä tuleekin esille monia läpikäytyjä asioita eli, jos sisäistät tämän olet jo jyvällä Java ohjelmoinnissa.
Tässä on nyt sitten ohjelma mikä tulostaa numerot 0-10.
public class luku
{
public static void main(String args[])
{
int luku=0;
for (luku
= 0; luku<11; luku++)
System.out.println("Luku on "+luku);
}
}
Javassa on enemmänkin toistolauseita kuin yksi. Käymme nyt läpi WHILE lauseen
WHILE on aivan yhtä yksinkertainen kuin FOR lausekin. WHILE lausetta toistetaan niin kauan kuin ehto on tosi.
public class luku
{
public static void main(String args[])
{
int luku=0;
while (luku
< 11) {
System.out.println("Luku on "+luku);
luku ++; }
}
}
Äskeinen koodi tulostaa numerot 0:sta 10:neen.
Taulukot ovat erittäin hyödyllisiä pikku ominaisuuksia. Niihin voidaan ladata tietoa aivan kuin muuttujiin, mutta taulukkoon voi ladata monta eri arvoa. Eri arvoja kutsutaan taulukon solun INDEX numerolla.
Muodostan nyt taulukon jossa on 10 solua. Jokainen solu saa eri numero arvon. Ihan lopuksi numerot tulostetaan ruutuun.
public class taulukko
{
public static void main(String args[])
{
int[] taulukko
= new int[10];
for (int i=0; i < 10; i++)
taulukko[i] = i;
for (int i=0; i<10; i++)
System.out.println("Luku on
"+taulukko[i]);
}
}
Taulukoista voidaan muodostaa myös moniulotteisia.
int[][] taulukko = new int[10][10];
Nyt voimme laskea taulukkoon vaikka kertotaulun.
public class taulukko
{
public static void main(String args[])
{
int[][] taulukko
= new int[10][10];
for (int i=0; i < 10; i++)
for (int j=0; j < 10; j++)
taulukko[i][j] = i*j;
for (int i=0; i<10; i++)
for (int j=0; j < 10; j++)
System.out.println("Luku on
"+taulukko[i][j]);
}
}
Moniulotteisia taulukoita tarvitaan paljon 3D ohjelmoinnissa, ja kutsumme niitä matriiseiksi. Taulukot voivat tietysti olla mitä tahansa tyyppiä. Niihin voidaan ladata vaikka olioita, jos se on tarpeen.
Kuten jo aiemmin kerroin STRING ei ole muuttuja tyyppi vaan olio. Sen takia ei myöskään saanut loikata alas parvekkeelta. Se että STRING on olio ei tee tätä yhtään vaikeammaksi. Sitä tuskin edes huomaa.
STRING olio määritellään aivan kuin muuttujakin.
String merkkijono = ”Moikka”;
Tuollainen esitys tapa ei kelpaa muille oliolle, mutta STRING on säännön vahvistava poikkeus (hyvä niin). STRING oliolla on ominaisuuksia joita alamme heti miten käymään läpi.
Merkkijonoja voidaan yhdistellä + operaattorilla, tähän tapaan.
String merkkijono = ”Terve ”+toinen_mjono;
Toinen_mjono voisi olla vaikka int tyyppiä ja se ei aiheuttaisi ongelmaa, koska STRING muuttaa int tai jonkin muun tyypin automaattisesti STRING yhteensopivaksi. Tästä toimenpiteestä vastaa toString() metodi. STRING oliolla on muitakin ominaisuuksia.
|
IndexOf(String) IndexOf(Char) |
Hakee merkkijonosta
halutun merkin. |
|
lastIndexOf(String) lastIndexOf(Char) |
Hakee merkkijonosta
halutun merkin aloittaen haun lopusta. |
|
toUpperCase() |
Muuntaa merkkijonon
kirjaimet isoiksi. |
|
toLowerCase() |
Muuntaa merkkijonon
kirjaimet pieniksi. |
|
toString |
Muuttaa tyypin
merkkijonoksi. |
|
compareTo(String) |
Vertaa kahta merkkijonoa. |
|
equals(String) |
Ovatko merkkijonot samoja. |
|
length(String) |
Merkkijono pituus. |
|
replace(Char, Char) |
Korvaa merkkijonon merkit
uusilla. |
|
trim |
Poistaa merkkijonosta
ylimääräiset tyhjät merkit. |
|
subString(int) |
Tulostaa merkkijonon
annetusta kohdasta eteenpäin. |
|
subString(int, int) |
Tulostaa merkkijonon
halutun kohdan. |
|
charAt(int) |
Tulostaa merkin, joka on
haettavassa kohdassa. |
Seuraavaksi ohjelma, joka tulostaa tekstin tietyn kohdan isoilla kirjaimilla.
public class text
{
public static void main(String args[])
{
String text =
"Java ohjelmointi on kivaa.";
text = text.substring(5, text.length());
text.toUpperCase();
System.out.println(text);
}
}
Huomaa mitä ohjelma tulostaa, vaikka merkkijono onkin erilainen. Huomaa myös ettei kaikki kirjaimet ole aluksi isoja.
STRING asiaa olisi enemmänkin, mutta me emme käsittele niitä tässä tutoriaalissa vaan me siirrymme muille maille.
Olio-ohjelmointi onpa hieno sana. Se kaiken lisäksi on hienoa. Oliot ovat erittäin tervetullut tapa tehdä ohjelmia. Tällainen olio-ohjelmointi helpottaa ohjelmoijan työtä ja se tee koodista selkeämpää. Oliolla on suuri merkitys kun luodaan isoja ohjelmia, kuten Windows. Ohjelmien ei tietenkään tarvitse olla Windowsin kokoisia hyödyntääkseen olioita, mutta Windows tuli ensimmäisenä mieleen. Windowsissa kaikki on olioilla esim. napit, valintalaatikot, listat, yms. Tämä helpottaa ohjelmoijan työtä, koska kun nappi on olio, on se helppo muodostaa ja käyttää omassa ohjelmassa. Olio antaa myös mahdollisuuden muuttaa nappia omiin tarkoituksiin. Sen kokoa ja ominaisuuksia, yms. pääsee muuttamaan ilman, että sinun tarvitsee tietää kuinka nappula on koodattu. Riittää kun tietää miten napin metodeita käytetään.
Olioita voidaan toki tehdä itsekin. Koodaamme luokan, vaikka laatikko. Nyt voimme kaikkialla käyttää samaa oliota. Lisäksi voimme muuntaa laatikkoa aivan niin kuin haluamme. Voimme jopa ladata laatikkoja taulukkoon ja näin luoda monta laatikkoa joita pääsemme helposti muuntamaan. Ohjelmoijan työtä helpottaa se, että vaikka laatikoita onkin paljon koodi on silti selkeää. Koodista ei myöskään kasva isoa vaikka laatikoita olisi 1000. Oliot eivät kuitenkaan ole niin ihmeellisiä kuin miltä kuulostavat. Itse asiassa oliot ovat paljon samanlaisia kuin C:n structit. Tuo ei tietenkään kerro mitään niille jotka eivät C:tä ole koodanneet. No kuinka näitä olioita nyt sitten käytetään ja mitä ne oikein ovat?
Olio on muodostettu luokasta. Luokka on siis olion muoto. Voimme muodostaa olion melkein jokaisesta luokasta. Javassa on myös luokkia joista ei voi muodostaa oliota. Tällaiset luokat on ABSTRACT tyyppisiä. ABSTRACT tyyppisestä luokasta ei voida luoda oliota. Oliolla on tila ja toimintoja. Eli sillä on muuttujia ja metodeita. Olio sanaan ei kannata niin hirveästi takertua. Olio on melkein kuin muuttuja laajemmilla toiminnoilla. Aina kun koodaamme jotain ohjelmaa niin olio sanasta ei ole mitään hyötyä eli tuota sanaa ei kannata pelätä. Voimme ajatella oliota luokkana niin kuin se onkin. Eli sen kun koodaat luokan ja muodostat siitä olion. Olio on englanniksi Object eli kun olemme Java koodauksen Guruja alamme tituleerata aina englanniksi moisia koodi sanoja. Tässä vaiheessa on paras kuitenkin jättää Guruilut muille kavereille. Eikös vaan?
Olioiden tärkeimpiin ominaisuuksiin kuuluu perintä. Periminen on myös yksi sana johon usein jäädään kiinni. No ei tämäkään mikään vaikea asia ole. Luokka (Class) voi periä ominaisuudet ja tiedot toiselta luokalta (Superclass). Näin luokasta, joka perii tietoa tulee aliluokka (Subclass). Tämä on samanlaista kuin ihmisten tilanteessa. Lapsi perii vanhempien ominaisuudet.
Olio-ohjelmointi ei eroa rakennepohjaisesta koodista paljoakaan. Tärkein muutos onkin ajattelutapa. Tämä osa-alue onkin kaikkein vaikein. Välillä on todella hankalaa keksiä järkeviä luokkia suorittamaan haluttu tehtävä. Tällöin ei todellakaan kannata lähteä vain koodaamaan luokkaa, koska koodisi on pian niin sekaista ettet edes itse saa siitä selkoa.
Ohjelmat kannattaakin aina suunnitella tarkasti ennen toteutusta. Hyvä tapa suunnitella ohjelman luokat on kirjoittaa ylös ne toiminnot ja asiat jotka ohjelmaan haluat. Sitten vain lajittelet kirjoittamasi asiat omiin osa-alueisiinsa. Nisäkkäät ovat eläimiä, valaat ovat nisäkkäitä ja jne. jne. Nyt voimme luoda kaavion.

Tällaisten kaavioiden luonti on erittäin kannattavaa. Tämä helpottaa paljon ohjelman rakentelua.
Olioiden käyttö on helppoa. Ne muodostetaan saamaan tapaan kuin taulukot tai muuttujat.
Luokka olio = new Luokka();
Olion luontiin käytetään new operaattoria. Luonti voi olla myös kaksivaiheinen. Kuten voimme nähdä alla olevasta esimerkistä. Juuri äsken näimme yhden tavan luoda olion, mutta tämä on minusta selkeämpi. Tässä tyylissä olion nimi ja olion luonti ovat selvästi erillään. Ensin määritellään olion nimi ja sitten luodaan itse olio.
Luokka olio;
olio = new luokka();
Tuo tekee saman kuin aiempikin eli muodostaa olion luokasta. Tätä kutsutaan luokan ilmentymäksi. Olion tietoihin ja toimintoihin päästään käsiksi viittaamalla olion nimeen ja sen jälkeen toiminto tai muuttuja, jonka olio sisältää.
olio.metodi();
Olet käyttänyt jo olioita, esim. STRING olio.
text.toUpperCase();
Tuohan teki text-merkkijonon kaikista kirjaimista isoja kirjaimia. Rivissä kutsutaan STRING olion metodia toUpperCase(). Samalla tavalla kutsutaan myös omia olioita ja niiden metodeita tai muuttujia.
Kaikkiin muuttujiin ja metodeihin ei päästä käsiksi noin. On olemassa ABSTRACT tyyppi. Luokka tai metodi voi olla ABSTRACT tyyppiä. Tämä tarkoittaa seuraavaa.
ABSTRACT tyyppisellä metodilla ei ole runkoa (koodia) vaan metodin rutiinit suoritetaan toisessa luokassa. Luokka pitää aina määritellä ABSTRACT tyyppiseksi, jos luokassa on yksikin metodi mikä on ABSTRACT tyyppinen. Tällainen metodi tehdään näin.
abstract void Luokka();
Kun luokka on ABSTRACT tyyppinen, niin siitä ei voida luoda oliota vaan se pitää periyttää. Luokassa joka perii ABSTRACT luokalta pitää löytyä kantaluokan ABSTRACT:in metodin suoritusosa.
void metodi() {
// koodia
}
Tästä tulee vielä isompi esimerkki, joten jäitä hattuun.
Tämä on tyyppi niin kuin ABSTRACT, mutta tämä tyyppi eroaa toiminnaltaan ABSTRACT:ista. PUBLIC tyyppi on nimensä mukaan julkinen eli luokan tilanteessa se tarkoittaa seuraavaa. Siitä voidaan muodostaa olio ja se voidaan periä.
public class luokka
FINAL tyyppi taas tarkoittaa, että luokka ei periydy. Luokasta voidaan kuitenkin muodostaa olio, mutta sisältöä ei voi muuttaa.
final class luokka
Ja nyt silmät, korvat, nenä kaikki mikä auttaa sinua sisäistämään tämän, auki. Tämä yksi tärkeimpiä ominaisuuksia olio-ohjelmoinnissa. Tämä ominaisuus, myös erottaa olio-ohjelmoinnin esim. lausepohjaisesta ohjelmoinnista. Eipä tässä sitten muuta kuin perimään.
This on muuttuja, joka viittaa sen hetkiseen olioon. This muuttujan käyttö on helppoa.
this.muuttuja = 10;
This muuttujan yleisin käyttökohde on tilanne jossa sen hetkinen olio pitää antaa parametrinä jollekin toiselle metodille. Tällaista nähdään ainakin kun asetetaan kuuntelija, jos tapahtumasta aiheutuva metodi on samassa luokassa.
addWindowListener(this);
Super muuttuja on samanlainen kuin this, mutta se viittaa kantaluokkaan. Näin voit kutsua vaikka yläluokan muodostajaa.
super();
EXTENDS on varattu sana, joka ilmoittaa miltä luokalta peritään. Olet jo käyttänyt EXTENDS sanaa, ainakin ensimmäisessä harjoitus ohjelmassa.
public class text extends
Applet
Rivi siis tarkoittaa, että luokka text on julkinen ja se perii Applet luokan ominaisuudet. Tämä ei ole ainut mahdollisuus hyödyntää perintää. Muitakin luokkia on mahdollista periä. Luokat jotka FINAL tyyppisiä ei voida periä, mutta muut kyllä. Kun perit jonkin luokan saat sen metodit ja muuttujat käyttöösi aivan kuin olisit koodannut ne omaan luokkaasi. Perintä helpottaa ohjelmointia huomattavasti, koska jo toimivaa koodia ei tarvitse kirjoittaa uudestaan eikä testata.
Perintä on sammallista kuin oikeassa elämässä. Lapsi perii vanhempien taidot eli ominaisuudet. Jos muutat lausetta hieman huomaat varmasti yhtäläisyyden. Muuta lauseen lapsi sana alaluokaksi ja vanhemmat sana yläluokaksi. Eli saimme lauseen, joka kuuluu. Alaluokka perii yläluokan ominaisuudet.
Alla on kaavio, jossa nuolen suunta esittää perimissuunnan. Eli eläimet luokka periytyy kaikkiin alaluokkiin.
Matelijat Jyrsijät Nisäkkäät Eläimet
![]()
Nisäkkäät luokka määriteltäisiin näin.
class nisakkaat extends elaimet
(HUOM! Javassa ei voi käyttää skandinaavisia merkkejä luokan, metodin tai muuttujien nimissä. Tai oikeastaan se ei pidä paikkaansa. Javassa voidaan käyttää (tai niin olen kuullut) skandinaavisia merkkejä, mutta en kehota niin tekemään.)
Otetaan esimerkki, jossa ohjelma tulostaa ruudulle henkilön tiedot. Ohjelma hyödyntää perintää.
abstract class kortisto
{
String nimi;
String osoite;
String puhelin;
kortisto(String
nimi, String osoite, String puhelin) {
this.nimi =
nimi;
this.osoite =
osoite;
this.puhelin =
puhelin;
}
abstract void nimet();
abstract void
osoitteet();
abstract void
puhelimet();
public String tiedot() {
return
"Nimi : "+this.nimi +"\n"+
"Puhelin : "+this.puhelin;
}
}
Henkilot luokka perii kortisto luokan ominaisuudet ja toteuttaa ABSTRACT tyyppiset metodit.
class henkilot extends kortisto
{
henkilot(String nimi,String osoite, String puhelin) {
super(nimi, osoite, puhelin);
}
void nimet()
{
System.out.println(nimi);
}
void
osoitteet() {
System.out.println(osoite);
}
void
puhelimet() {
System.out.println(puhelin);
}
}
User luokka on varsinainen ohjelma. Joka luo henkilot luokasta kaksi oliota henkilo1 ja henkilo2. Lopuksi ohjelma tekee tulosteet.
class user
{
public static void main(String args[])
{
henkilot henkilo1
= new henkilot("Pekka" , "Pekanpolku" ,
"04055566622");
henkilot henkilo2
= new henkilot("Jukka" , "Jukanpolku" ,
"04022666555");
henkilo1.nimet();
henkilo1.osoitteet();
henkilo1.puhelimet();
System.out.println(henkilo2.tiedot());
}
}
Jos haluaisi luoda ohjelman, joka tekee tuollaisen tulosteen ei olisi tietenkään järkevää käyttää perintää, mutta nyt halusimme nähdä perinnän toimintaa. Tätä oppia soveltamalla saadaan aikaan vaikka mitä.
Luokka voidaan myös koostaa olioista. Tämä on usein järkevämpää kuin perintä systeemi. Koostaminen on viisasta varsinkin pikkuohjelmissa. Pienissä ohjelmissa perinnän käyttö on hiukan kyseenalaista.
Luokan koostaminen muistuttaa paljon omia C:n H tiedostojen käyttöä. Luokassa siis muodostetaan olioita muista luokista. Tämä toimii samoin aiemminkin.
Luokka olio = new Luokka();
Tuohan oli luokan ilmentämistä. No joka tapauksessa nyt meillä on olio, jonka nimi on olio. Voimme luoda samalla tavalla lisää oliota. Ja kun viittaamme olion nimeen ja sen jälkeen kirjoitamme metodin tai muuttujan nimen, jonka kimppuun haluamme käydä. Näin voimme tehdä luokan koostamalla. Koostaminen on erittäin järkevää ja usein paljon perintää helpompaa.
HUOM! Ei ole koskaan suotavaa, että käsittelet toisen luokan muuttujia suoraan.
Nyt seuraa esimerkki, joka tekee suurin piirtein saman kuin aiempikin. Tällä kertaa ohjelma tehdään koostamalla.
class user
{
public static void main(String args[])
{
henkilot henkilo1
= new henkilot("Pekka" , "Pekanpolku" ,
"04055566622");
henkilot henkilo2
= new henkilot("Jukka" , "Jukanpolku" ,
"04022666555");
System.out.println(henkilo1.tiedot());
System.out.println(henkilo2.tiedot());
}
}
Henkilot luokka ottaa parametrina nimen, osoitteen ja puhelin numeron. Metodi tiedot() palauttaa tiedot takaisin. Ja tiedot tulostetaan user luokassa.
class henkilot
{
String nimi;
String osoite;
String puhelin;
public
henkilot(String nimi,String osoite, String puhelin) {
this.nimi = nimi;
this.osoite =
osoite;
this.puhelin =
puhelin;
}
public String
tiedot() {
return "Nimi :
"+nimi+"\n"+
"Osoite : "+osoite+"\n"+
"Puhelin : "+puhelin;
}
}
C-ohjelmoijilla ei varmasti tule vaikeuksia tämän kanssa. Tämä on melkein sama kuin H tiedoston käyttö ja rakentaminen. C++ ohjelmoijat ovat jo kuin kotonaan. Oliot toimivat lähes tulkoon samoin Javassa ja C++:ssa.
Näistä olemme puhuneet jo paljon, mutta nyt tulee niistä lisää. Metodit ovat luokan toimineita. Eli koodi on metodeissa ja niitä kutsutaan suoraan metodin nimellä.
metodi();
Tuossa kutsuimme metodia ”metodi()”. Olemme jo monesti kutsuneet metodeita tietämättä mitä loppujen lopuksi teimme, mutta nyt seuraa selityksiä.
Metodi voi palauttaa arvon return komennolla. Metodin palautus tyyppi pitää olla samaa tyyppiä kuin palautettava arvo eli näin.
public int palauta() {
int luku=10;
return luku;
}
Nyt meillä on metodi, jonka nimi on palauta. Metodin palautus tyyppi on int, koska palautettava arvokin on int tyyppiä.
Metodin ei tarvitse olla palauttava, mutta silloin palautus
tyyppi on void.
public void palauta() {
int luku=10;
// Lukua ei voida
palauttaa.
}
Metodien muuntimet ovat lähestulkoon sama kuin luokalla.
|
public |
Metodia voidaan kutsua
mistä luokasta tahansa. |
|
final |
Voidaan kustua mistä vain,
mutta ei periydy |
|
private |
Metodia voidaan käyttää
vain omassa luokassaan. |
|
abstract |
Metodilla ei ole lainkaan
koodia vaan se suoritetaan alaluokassa. |
|
synchronized |
Metodia voi käyttää vain
yksi säie kerrallaan |
|
native |
Metodi tuodaan toisesta
ohjelmointikielestä |
|
static |
Metodi suoritetaan
ensimmäisenä. |
Nyt seuraa pieni esimerkki metodeista.
class kerro
{
public static void main(String args[])
{
double tulos =
kerroluku(2.30, 4.21);
System.out.println("Tulos on "+tulos);
}
static double
kerroluku(double luku1, double luku2)
{
return
luku1*luku2;
}
}
Suomennos on muodostin. Muodostin on metodi, joka antaa oliolle alkuarvot. Muodostin pitää olla saman niminen kuin luokka. Tällöin muodostin toteutetaan heti oliota muodostaessa. Muodostin metodeja voi olla paljonkin. Voi kirjoittaa monta muodostin metodia kunhan jokainen saa parametrinaan eri arvot.
class luokka
{
public luokka()
{
// Muodostin
}
public luokka(int
i) {
// Muodostin
}
}
Rajapinnat liittyvät hyvin olennaisesti olioihin kuten kaikki muukin Javassa. Rajapinnat muistuttavat paljon ABSTRACT luokkia. Rajapinta luokat eivät tee mitään vaan ne määrittelevät tietynlaisen koodaus pohjan.
IMPLEMENTS on varattusana, joka määrittelee mitkä rajapinnat on käytössä.
public class luokka extends Applet implements
Runnable
Javassa ei ole muunlaista moni periytyvyyttä kuin rajapinnoilla, joita voidaan ottaa käyttöön enemmän kuin yksi kerrallaan.
implements Runnable, ActionListener
Kun käytät rajapintoja sinun täytyy ylikirjoittaa kaikki rajanpinnan metodit. Tämä tapahtuu näin.
metodi() {
// Tyhjää
}
No niin olemme jo jauhaneet riittämiin olioista ja metodeista. On aika siirtyä käyttöliittymiin.
3.0 Käyttöliittymä
Javassa käyttöliittymät rakennetaan AWT-komponenteista (Abstarct Window Toolkit). Käyttöliittymällä voidaan luoda Windows tyylisiä ohjelmia vaikka internetiin. AWT:stä löytyy monia komponentteja mm.
Säiliö eli container on erittäin tärkeä elementti komponenttien kanssa ohjelmoidessa. Kaikki komponentit heitellään säiliöön, jossa niitä voidaan tutkailla. Säiliö on paneelin yläluokka (paneelit tulevat seuraavassa luvussa). Myös ikkunoissa on säiliöluokka.
Säiliöllä on metodeita joita tarvitaan enemmän tai vähemmän, mutta tässä metodeita.
|
add(Component) |
Lisää komponentin
säiliöön. |
|
add(String, Component) |
Lisaa merkkijonon ja
komponentin säiliöön. |
|
remove(Component) |
Poistaa komponentin. |
|
removeAll() |
Poistaa kaikki
komponentit. |
|
setLayout(LayoutManager) |
Asettaa layoutin. |
|
getLayout() |
Palauttaa layoutin. |
|
getComponet(int) |
Palauttaa komponentin. |
|
getComponets() |
Palauttaa kaikki
komponentit. |
|
getComponentCount() |
Palauttaa komponenttien
lukumäärän. |
Metodeita on lisääkin ja löydät selitykset Java omista ohjeista.
No niin nyt kun säiliö on käyty läpi voimme alkaa ohjelmoimaan komponentteja. Säiliöt eivät ehkä vielä auenneet silmienne eteen, mutta opit ne kyllä.
Säiliö on vain komponenttien säilö. Se ei ole sen kummempi juttu se.
Kuva 3.1
BUTTON eli painonappi on varmasti kaikille tuttu Windowsista. Tällaisen napin teko Javalla ei tosiaankaan ole vaikeaa. Kuten jo aiemmin kerroin nappi on olio, joten se voidaan helposti ottaa mukaan omaan ohjelmaamme. Meidän tarvitsee vain tehdä BUTTON olio.
Seuraavassa on esimerkki napin tuonnista ohjelmaan. Ohjelma on Java Appletti eli se toimii vain nettisivulla.
import java.awt.*;
import java.applet.*;
public class nappi extends Applet
{
Button nappi;
public void init()
{
nappi = new Button(" PAINA
");
setSize(320, 240);
setBackground(Color.white);
this.add(nappi);
}
}
Painonapilla on myös ominaisuuksia, joita ei tullut tuossa esille.
|
Button() |
Nappi, jossa ei lue mitään. |
|
Button(String) |
Nappi, jossa on teksti. |
|
setLabel(String) |
Napin teksti. |
|
getLabel() |
Palauttaa napin tekstin. |
|
addActionListener(ActionListener) |
Asettaa
tapahtumakuuntelijan. |
|
getActionCommand |
Palauttaa tapahtuman
nimen. |
|
removeActionListener(ActionListener) |
Poistaa
tapahtumakuuntelijan. |
Napilla on muitakin ominaisuuksia, mutta tässä tärkeimmät. Ominaisuudet kannattaa kuitenkin käydä katsomassa Javan ohjeista.
Label sanan suomennos kuului etiketti, nimilappu ja osoitelappu. Siitä voi jokainen valita itselleen sopivimman. Etiketti kuvastaa komponenttia parhaiten vaikka kamala sana onkin. Itse olen päättänyt käyttää label sanaa.
Label on siis teksti. Tietynlainen otsikko teksti, joita näkee Windows ohjelmissa koko ajan. Etiketti tuodaan ohjelmaan samalla tavalla kuin nappi.
Label etiketti = new
Label(”Teksti”);
Myös Label oliolla on ominaisuuksia. Käydään läpi vain tärkeimmät
|
setText(String) |
Asettaa tekstin. |
|
getText() |
Palauttaa tekstin. |
|
Label() |
Tekee tyhjän etiketin. |
|
Label(String) |
Etiketti tekstillä. |
|
Label(String, int) |
Etiketti tekstillä ja
paikalla. |
Kuva 3.2
Vierityspalkki olisi hyvä suomennos tuolle ja sitä varmaan käytettäänkin. Vierityspalkilla voi nimensä mukaan vierittää vaikka tekstiä. Toki vierityspalkille voi keksiä muutakin tekoa, kuten esimerkissämme tullaan näkemään. No aletaan sitten kahlata vierityspalkkia alta pois.
Palkin muodostus on samanlaista kuin aiemmin. Vierityspalkilla on vain hieman erilaiset muodostajat. Eli vieritys palkin muodostajat.
|
ScrollBar() |
Vaakasuora palkki. |
|
ScrollBar(int) |
Palkki jolla on haluttu
suunta. |
|
SrcollBar(int, int, int, int, int) |
Palkki jolla on suunta,
kohdistin paikka, sivun koko, minimi arvo, maksimi arvo. |
Nyt jos haluamme luoda vierityspalkin se käy helposti.
ScrollBar palkki = new
ScrollBar();
Vierityspalkin suunta määrätään HORIZONTAL ja VERTICAL muuttujilla.
Kuten tiedämme vierityspalkin kohtaa määrää kohdistin ja sitä voidaan liikuttaa muutenkin kuin hiirellä. Metodi setValue(int) asettaa kohdistimen haluttuun kohtaan. Kohdistimen paikan saa selville getValue() metodilla. Metodi palauttaa int tyyppisen arvon.
Muita vierityspalkin metodeita.
|
setValues(int, int, int,
int) |
paikka,sivun koko, min
arvo, max arvo |
|
getMaximum() |
Maksimiarvo |
|
getMinimum() |
Minimiarvo |
|
getUnitIncrement |
Palauttaa seuraavan rivin
arvon. |
|
setUnitIncrement |
Asettaa seuraavan rivin
arvon. |
|
getBlockIncrement |
Palauttaa seuraavan sivun
arvon. |
|
setBlockIncrement |
Asettaa seuraavan sivun
arvon |
Vierityspalkilla on myös kuuntelija AdjustmentListener. Seuraavassa mahdollisia tapahtumia.
|
TRACK |
Kohdistin liikkui. |
|
UNIT_DECREMENT |
Kohdistin liikkui rivin
alas. |
|
UNIT_INCREMENT |
Kohdistin liikkui rivin
ylös. |
|
BLOCK_ DECREMENT |
Kohdistin liikkui sivun
alas. |
|
BLOCK_INDECREMENT |
Kohdistin liikkui sivun
ylös. |
AdjustementEvent oliolla on pari metodia. Tapahtuman tyyppi saadaan selville getAdjustmentType() metodilla. GetAdjustable() metodilla saadaan selville se vierityspalkki, joka aiheutti tapahtuman.
Vierityspalkilla on vielä muutama metodi mitä tässä ei mainita, mutta Javan omat ohjeet auki niin siellä on infoa.
Ihan tähän loppuun ajattelin mainita, että virityspalkeista tulee vielä esimerkki kunhan olemme ensin käsitelleet layoutit.
Kuva 3.3
Checkbox eli valintalaatikko. Näitä laatikoitakin olet nähnyt paljon. Yleensä joka paikassa missä voidaan muuttaa jotain asetusta, löytyy ainakin yksi valintalaatikko. No olit nähnyt sellaisen tai et, mutta nyt sinä teet sellaisen.
Valintalaatikko ei ole sen kummempi kuin muutkaan. Itse asiassa kaikki komponentit toimivat samaan tyyliin vain metodit ja muodostajat eroavat.
Halusin heti alkuun pienen muistin virkistyksen. Samalla tein pienen esimerkin valintalaatikosta.
import java.awt.*;
import java.applet.*;
public class valinta extends Applet
{
Checkbox valinta;
public void
init()
{
valinta = new
Checkbox("Valintalaatikko", true);
setSize(320, 240);
setBackground(Color.white);
add(valinta);
}
}
Yllä oleva ohjelma siis on appletti eli selaimella toimiva Java sovellus. Ohjelma luo valintalaatikon, ei muuta.
Valintalaatikolla on kaksi tilaa on ja off. On tila on silloin kun laatikossa on rasti ja off jos rastia ei ole.
Valintalaatikolla on muiden komponenttien tapaan muutama erilainen muodostaja tarkemmin sanottuna muodostajia on viisi.
|
Checkbox() |
Laatikko ilman tekstiä |
|
Checkbox(String) |
Laatikko tekstillä. |
|
Checkbox(String, boolean) |
Laatikko tekstillä ja
tilalla (true/false) |
|
Checkbox(String, boolean, CheckboxGroup) |
Laatikko tekstillä,
tilalla ja ryhmällä. |
|
Checkbox(String, CheckboxGroup, boolean) |
Laatikko tekstillä,
ryhmällä ja tilalla. |
Valintalaatikon tiloja voidaan tarkastella metodilla getState(). Metodi palauttaa joko arvon on, jos rasti on ruudussa. Off palautuu, jos rastia ei ole. SetState() metodi taas asettaa tilan. Seuraavassa listauksessa on valintalaatikon metodeita.
|
getLabel() |
Palauttaa valintalaatikon
tekstin. |
|
setLabel(String) |
Asettaa valintalaatikon
tekstin. |
|
getSelectedObjects() |
Palauttaa valitut valintalaatikot. |
|
getActionCommand() |
Palauttaa tapahtuman
nimen. |
|
setActionCommand() |
Asettaa tapahtuman nimen. |
|
setCheckboxGroup() |
Asettaa valintalaatikon
ryhmään. |
|
getCheckboxGroup() |
Palauttaa ryhmän johon
laatikko kuuluu. |
Valintalaatikon kaikki metodit on määritelty Java omissa ohjeissa.
Kuva 3.4
Radiobutton olisi suomeksi radionappi tai jotain. Radionappi on kuin valintalaatikko, mutta radionappia käytetään ryhmissä. Tämä tarkoitta sitä, että vain yksi radio voi olla valittuna kerrallaan. Radionappi muodostetaan valintalaatikosta antamalla valintalaatikolle valintalaatikkoryhmä (CheckboxGroup). Tämä selviää parhaiten esimerkistä.
import java.awt.*;
import java.applet.*;
public class test extends Applet
{
Checkbox valinta1;
Checkbox valinta2;
CheckboxGroup rg = new CheckboxGroup();
public void
init()
{
valinta1 = new Checkbox("Radionappi 1", true,
rg);
valinta2 = new Checkbox("Radionappi 2", true,
rg);
setSize(320, 240);
setBackground(Color.white);
add(valinta1);
add(valinta2);
}
}
Valintalaatikkoryhmä on olio, joka muodostettiin heti ohjelman alku metreillä. Sitten vain tein normaalit valintalaatikot ja annoin niille ryhmän. Tällöin valintalaatikoista tulikin radionappeja. Siinä kaikki HELPPOA !!!
Kuva 3.5
Tekstikenttä olisi kiva suomennos tai ainakin parempi kuin tekstipelto. Tällaiseenkin olet jo törmäillyt Windowsissa moneen otteeseen. Tekstikenttään kirjoitetaan tekstiä vaikkapa nimi. Sitten sitä käytetään oman mielen mukaisesti.
Usein tekstikentän tallennetaan String oliolle ja sitä tarkastellaan siellä ja tehdään mahdolliset muutokset.
Tekstikenttä komponentti toimii samalla tyylillä kuin muutkin eli.
TextField tekstikentta;
tekstikentta = new TextField("Tähän voi
kirjoittaa tekstiä");
Tekstikentällä on myös erialisia muodostajia neljä kappaletta.
|
TextField() |
Tyhjä tekstikenttä. |
|
TextField(String) |
Tekstikenttä tekstillä. |
|
TextField(int) |
Tekstikenttä ilman
tekstiä, mutta kentällä on määrätty pituus. |
|
TextField(String, int) |
Tekstikenttä tekstillä ja
pituudella. |
Tekstikentällä on monia hyviä metodeita joiden avulla sieltä saadaan juuri se tieto mitä halutaan.
|
getText() |
Palauttaa tekstin. |
|
setText(String) |
Asettaa tekstin. |
|
selectAll() |
Asettaa tekstin valituksi. |
|
select(int, int) |
Valitsee tekstin
numeroarvojen välliltä. |
|
getSelectedText() |
Palauttaa valitun tekstin. |
|
getSelectionStart() |
Palauttaa valitun kohdan
alkupaikan. |
|
getSelectionEnd() |
Palauttaa valitun kohdan
loppupaikan. |
|
setEditable(boolean) |
Asettaa kentän
muokattavaksi. |
|
isEditable() |
True jos kenttää voidaan muokata. False jos ei. |
|
getColumns() |
Palauttaa sarakkeiden
määrän. |
|
setCollumns(int) |
Asettaa sarakkeiden
määrän. |
Ulkopuolelle jäi monta ominaisuutta, mutta ne löytyvät Javan omista ohjeista.
Tekstikentän tapahtumat kirjoitetaan textValueChanged metodiin. Metodi kuuluu TextListener rajapinnalle, joka täytyy myös ottaa käyttöön. Tekstikentällä on metodi addTextListener(). Tämä asettaa kuuntelijan aktiiviseksi. Nyt ohjelma voi reagoida tekstin muutoksiin.
Nyt vielä loppuun pieni ohjelma. Ohjelmaan voidaan kirjoittaa tekstiä ja tekstin pituus tulostuu kokoajan viereiseen tekstikenttään.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class test extends Applet implements
TextListener
{
TextField edit1, edit2;
String teksti = "";
public void
init()
{
edit1 = new
TextField("Tähän voi kirjoittaa tekstiä");
edit2 = new TextField();
setSize(320, 240);
setBackground(Color.white);
edit1.addTextListener(this);
add(edit1);
add(edit2);
}
public void
textValueChanged(TextEvent e)
{
teksti =
edit1.getText();
edit2.setText(""+teksti.length());
}
}
Kuva 3.6
Tekstialue olisi suora suomennos, mutta ei kyllä sovi minun korvilleni tuo. Tekstilaatikko olisi jo paljon parempi. Tekstilaatikko taitaa ollakin yleinen suomenkielinen nimi tällä komponentille.
Tekstilaatikkoa käytetään isompien tekstien kirjoittamiseen. Usein tätä nähdään kun kirjoitetaan kommentteja jollekin. Tietysti tekstinkäsittely ohjelmissa olet myös tällaisen nähnyt. No mitä enää odotellaan.
Tekstilaatikko muodostetaan muiden kanssa samalla tyylillä.
TextArea memo = new
TextArea();
Tekstilaatikolla on myös monia muodostajia.
|
TextArea |
Tyhjä tekstilaatikko. |
|
TextArea(String) |
Tekstilaatikko tekstillä. |
|
TextArea(int, int) |
Tekstilaatikko jolla on
määrätty korkeus ja leveys. |
|
TextArea(String, int, int) |
Tekstilaatikko jolla on
teksti, korkeus, leveys. |
|
TextArea(String, int, int,
int) |
Tekstilaatikko jolla on
teksti, korkeus, leveys, vierityspalkki. |
Vierityspalkit tuodaan mukaan antamalla viimeiseksi esiteltyyn muodostajaan (TextArea(String, int, int, vierityspalkki) jokin seuraavista arvoista. Arvo on tyypiltään int ja se sijoitetaan muodostajan kohtaan missä lukee vierityspalkki.
|
SCROLLBARS_NONE |
Ei vierityspalkkeja. |
|
SCROLLBARS_BOTH |
Molemmat vierityspalkit |
|
SCROLLBARS_HORIZONTAL_ONLY |
Vain vaakasuora
vierityspalkki. |
|
SCROLLBARS_VERTICAL_ONLY |
Vain pystysuora vierityspalkki. |
Tekstilaatikon metodit ovat paljolti samat kuin tekstikentän, mutta joitain erilaisiakin sentään on. Tässä tekstilaatikon metodeja.
|
getText() |
Palauttaa tekstin. |
|
setText(String) |
Asettaa tekstin. |
|
selectAll() |
Asettaa tekstin valituksi. |
|
select(int, int) |
Valitsee tekstin
numeroarvojen välliltä. |
|
getSelectedText() |
Palauttaa valitun tekstin. |
|
getSelectionStart() |
Palauttaa valitun kohdan
alkupaikan. |
|
getSelectionEnd() |
Palauttaa valitun kohdan
loppupaikan. |
|
setEditable(boolean) |
Asettaa kentän muokattavaksi. |
|
isEditable() |
True jos kenttää voidaan muokata. False jos ei. |
|
getColumns() |
Palauttaa sarakkeiden
määrän. |
|
setCollumns(int) |
Asettaa sarakkeiden
määrän. |
|
getRows() |
Palauttaa rivien määrän. |
|
setRows(int) |
Asettaa rivien määrän. |
|
insert(String, int) |
Lisää tekstin haluttuun
kohtaan. |
|
ReplaceRange(String, int,
int) |
Vaihtaa tekstin annettujen
numeroarvojen välillä. |
Taas Java omat ohjeet auttaa, kun tarvittavaa metodia ei löydy tästä.
Kuva 3.7
Choice suomeksi olisi valinta. Minä kuitenkin pidä nimestä ComboBox ja käytänkin sitä. Onhan tälle suomenkielisiä nimiä keksitty kuten alasvetovalikko, valintalista, yms.
ComboBox:ia käytetään monesti vaikka eri URL osioteiden valintaan.
ComboBox luodaan aivan niin kuin muutkin komponentit.
Choice combobox = new
Choice();
ComboBox:illa ei ole kuin yksi muodostin.
|
Choice() |
Tekee tyhjän ComboBox:in |
ComboBox:iin voidaan lisätä valinta vaihtoehtoja metodilla addItem(String).
combobox.addItem(”Valinta
1”);
ComboBox:illa on toki muitakin metodeita.
|
addItem(String) |
Lisää uuden valinnan. |
|
getItem(int) |
Palauttaa valinnan. |
|
getItemCount() |
Palauttaa valintojen
lukumäärän. |
|
select(int) |
Asettaa valinnan
valituksi. |
|
select(String) |
Asettaa valinnan
valituksi. |
|
getSelectedItem() |
Palauttaa valitun
valinnan. |
|
getSelectedIndex() |
Palauttaa valitun valinnan
järjestysnumeron. |
|
remove(String) |
Poistaa valinnan. |
|
remove(int) |
Poistaa valinnan. |
|
removeAll() |
Poistaa kaikki valinnat. |
ComboBox:in valintoja voidaan hakea kahdella tavalla. Suoraan niiden nimellä tai järjestysnumerolla. Kumpi vaan sopii paremmin.
Tietysti ComboBox:lla on kuuntelija ja se on ItemListener. Varsinainen tapahtumasta aiheutuva koodi on metodissa itemStateChanged(). Metodi kuuluu ItemListener rajapintaan.
Nyt loppuu taas esimerkki. Ohjelmassa on valintoja ja kun valitset jonkun kirjautuu se viereiseen tekstikentään.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class test extends Applet implements
ItemListener
{
Choice combobox;
TextField tekstikentta;
public void
init()
{
combobox = new Choice();
tekstikentta = new TextField(20);
combobox.addItem("Valinta 1");
combobox.addItem("Valinta 2");
combobox.addItem("Valinta 3");
setSize(320, 240);
setBackground(Color.white);
combobox.addItemListener(this);
add(combobox);
add(tekstikentta);
}
public void
itemStateChanged(ItemEvent e)
{
tekstikentta.setText(combobox.getSelectedItem());
}
}
Kuva 3.8
Lista komponentti. Tämä on myös hyvin yleinen komponentti Windowsissa. Sitä käytetään runsaasti vaihtoehtojen valinnassa (Missäs sitten?).
Listalla on kolme erilaista muodostajaa.
|
List() |
Tyhjä lista. |
|
List(int) |
Lista, jossa on määrätty
määrä rivejä. |
|
List(int, boolean) |
Lista jolla on rivien
lukumäärä ja monivalinta joko päällä tai pois |
Lista on paljon samanlainen kuin ComboBox. Joitain eroja kuitenkin on. Tässä nyt lista komponentin metodeja.
|
addItem(String) |
Lisää uuden valinnan. |
|
getItem(int) |
Palauttaa valinnan. |
|
getItemCount() |
Palauttaa valintojen
lukumäärän. |
|
select(int) |
Asettaa valinnan
valituksi. |
|
select(String) |
Asettaa valinnan
valituksi. |
|
getSelectedItem() |
Palauttaa valitun
valinnan. |
|
getSelectedIndex() |
Palauttaa valitun valinnan
järjestysnumeron. |
|
remove(String) |
Poistaa valinnan. |
|
remove(int) |
Poistaa valinnan. |
|
removeAll() |
Poistaa kaikki valinnat. |
|
isIndexSelected(int) |
Katsoo onko valinta
valittuna. |
|
deselect(int) |
Poistaa valinnalta
valinnan. |
|
isMultipleMode() |
True jos monivalinta on päällä. False jos ei. |
|
setMultipleMode(boolean) |
Asettaa monivalinnan
päällä/pois. |
|
getSelectedItems() |
Palauttaa valitut
valinnat. |
|
getSelectedIndexes() |
Palauttaa valittujen
valintojen järjestysnumerot. |
|
getRows() |
Palauttaa rivien määrän. |
Listan kuuntelija on sama kuin ComboBox:lla eli ItemListener.
Tähän aivan luvun loppuun vielä hiukan isompi esimerkki. Ohjelmassa voi poistaa listasta valintoja ja lisätä sinne uusia (uusi valinta lisätään listan perään). Ohjelma tulostaa valitun valinnan nimen tekstikenttään.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class test extends Applet implements
ActionListener, ItemListener
{
List lista;
Button nappi1;
Button nappi2;
TextField edit1;
public void
init()
{
lista = new List();
nappi1 = new Button("Lisää
otsikko");
nappi2 = new
Button("Poista otsikko");
edit1 = new TextField(20);
lista.addItem("Valinta 1");
lista.addItem("Valinta 2");
lista.addItem("Valinta 3");
lista.addItem("Valinta 4");
lista.addItem("Valinta 5");
lista.addItem("Valinta
6");
lista.addItem("Valinta 7");
setSize(320, 240);
setBackground(Color.white);
lista.addItemListener(this);
nappi1.addActionListener(this);
nappi2.addActionListener(this);
add(lista);
add(nappi1);
add(nappi2);
add(edit1);
}
public void
actionPerformed(ActionEvent e)
{
if (e.getSource() == nappi1) {
lista.addItem("Uusi otsikko");
}
if (e.getSource() == nappi2) {
lista.remove(lista.getSelectedItem());
}
}
public void
itemStateChanged(ItemEvent e)
{
edit1.setText(lista.getSelectedItem());
}
}
4.0 Pohjat eli Layout
Pohjilla tarkoitan layouteja. Niitä me käymme nyt läpi tässä luvussa. Layoutit ovat todella tärkeitä luodessa AWT komponenttipohjaisia ohjelmia. Layout on eräänlainen pohja johon komponentit kiinnittyvät ja layoutista riippuu kuinka.
Layouteja on viisi kappaletta ja ne ovat
-
CardLayout
-
BorderLayout
-
FlowLayout
-
GridLayout
-
GridBagLayout
FlowLayout on oletus layout se on siis käytössä vaikka sitä ei itse koodattaisikaan. Se onkin käyttökelpoinen layout, mutta joskus tarvitaan muitakin layouteja. Javassa on välillä hankala saada komponentit itse haluamiin paikkoihin, mutta kyllä se sitten loppujen lopuksi onnistuu. Aletaan saman tien käymään läpi layouteja.
Eipä aletakkaan otetaan ensin paneelit. Nämä olisi ollut hyvä olla jo edellisessä luvussa, mutta sopivat tännekin.
4.1 PANEL
Panel eli paneeli. Paneeli on hyvä ominaisuus Javassa. Paneeli sisältää säiliön joten sinne voidaan säilöä komponentteja ja layouteja. Tämän takia paneelilla on helppo jakaa ruutua osiin ja tehdä uusi layout saatuun osaan. Näin voimme luoda sisäkkäisiä layouteja. Tästä tulee vielä harjoituksia tämän luvun lopussa.
4.2
FLOWLAYOUT
Kuva 4.1
Tämä on oletus layout. Se laittaa komponentit peräkkäin ja jos komponentti ei mahdu samalla riville siirrettään se riviä alemmas. Tämä on aivan sama kuin mitä tekstin käsittely ohjelma tekee tekstille. Sana ei mahdu riville siirrettään se yhtä alemalle.
FlowLayout luodaan näin.
setLayout(new
FlowLayout());
Flowlayout on olio joten se voidaan muodostaa kuin olio, mutta se pitää liittää säiliöön setLayout() metodilla.
Kaikki layoutit toimivat samoin.
FlowLayoutilla on kolme muodostinta, jotka ovat seuraavat.
|
FlowLayout() |
Luo layoutin. |
|
FlowLayout(int) |
Luo layoutin, jolla on
tasauslippu. |
|
FlowLayout(int, int, int) |
Luo layoutin, jolla on
tasauslippu, komponenttien väliin jäävä vaakasuora väli, pystysuora väli. |
Äsken näimme tasauslippu sanan. Sillä tarkoitettiin seuraavia muuttujia.
|
LEFT |
Vasemmalle |
|
CENTER |
Keskelle |
|
RIGHT |
Oikealle |
Esimerkki FlowLayoutin käytöstä.
import java.awt.*;
import java.applet.*;
public class test extends Applet
{
public void
init()
{
setLayout(new FlowLayout());
add(new Button("nappula 1"));
add(new Button("nappula 2"));
add(new Button("nappula 3"));
add(new Button("nappula 4"));
setSize(320, 240);
setBackground(Color.white);
}
}
4.3
CARDLAYOUT
Kuva 4.2
Tämä on erittäin erikoinen layout eikä kovin käytännöllinen monessakaan ohjelmassa. Layout tekee siihen asetetusta komponentista koko ruudun kokoisen. Ruudussa ei voi myöskään näyttää kun yhden komponentin kerrallaan. Metodilla next() saadaan toinen komponentti ruudulle ja vanha häipyy. Eli komponentit ovat ikään kuin kortteja joita vaihdellaan. Windows käyttelee tätä esim. Näytön asetuksissa.
CardLayout luodaan samoin kuin layoutit yleensäkin.
setLayout(new
CardLayout());
CardLayoutilla on myös muita muodostajia.
|
CardLayout() |
Luo layoutin. |
|
CardLayout(int, int) |
Luo layoutin, vaakasuora
väli, pystysuora väli. |
Tällä layoutilla on myös metodeita joilla ohjaillaan layoutin toimintaa.
|
next(Container) |
Seuraava kortti. |
|
previous(Container) |
Edellinen kortti. |
|
first(Container) |
Ensimmäinen kortti. |
|
last(Container) |
Viimeinen kortti. |
Kaikkien metodien esittelyt ovat ainakin Javan omissa ohjeissa.
HUOM!!! Kun käytät CardLayoutia muista antaa kortin nimi, kun asetat komponentin säiliöön.
add(nappi = new Button("nappula 1"),
"kortti 1");
4.4 BORDERLAYOUT
Kuva 4.3
BorderLayout eli kehyspohja. Layout laittaa komponentit säiliön reunoille ja keskelle yhden ison. Tämä on erittäin käytännöllinen layout, mutta kaipaisi hieman lisää metodeita. Layoutin eri reunojen leveyksiä pitäisi päästä muuttamaan, mutta ei niin ei.
Tämäkin Layout asetetaan kuin muutkin (en näytä sitä HÄ HÄ!). Layoutilla on kuitenkin pari muodostajaa, jotka näytän.
|
BorderLayout() |
Luo layoutin. |
|
BorderLayout(int, int) |
Layout jolle on määrätty
vaaka- ja pystysuorat välit komponenttien väliin. |
Layoutilla olisi muutama metodikin, mutta niistä kun ole juuri koskaan mitään hyötyä niin jätän ne pois. Ne toki löytyvät Javan omista ohjeista eli lunttaa sieltä jos on tarvis.
Pikku, pikku esimerkki kehyspohjasta eli BorderLayoutista.
import java.awt.*;
import java.applet.*;
public class test extends Applet
{
public void
init()
{
setLayout(new BorderLayout());
add(new Button("nappula 1"),
"Center");
add(new Button("nappula 2"), "West");
add(new Button("nappula 3"), "East");
setSize(320, 240);
setBackground(Color.white);
}
}
4.5
GRIDLAYOUT
Kuva 4.4
Verkkopohja onkin yksi parhaista pohjista. Layoutin avulla voidaan jakaa ruutu osiin. Tämä on erittäin käytännöllistä tiettyjä ohjelmia koodatessa esim. taskulaskin (voiko kliseisempää ohjelmaa enää keksiä).
Tämäkin muodostetaan melkein kuin muutkin sillä erolla, että layoutille pitää antaa rivien ja sarakkeiden määrät. Eli esimerkissä 3 = rivit ja 2 = sarakkeet.
setLayout(new GridLayout(3,2));
Parit muodostajatkin löytyy.
|
GridLayout() |
Layout oletusarvoilla. |
|
GridLayout(int, int) |
Layout rivien ja
sarakkeiden määrällä. |
|
GridLayout(int, int, int,
int) |
Layout rivien ja
sarakkeiden määrällä. Lisäksi vaaka- ja pystysuora tyhjä väli. |
Tällä olisi pari mainitsemisen arvoista metodiakin.
|
setRows(int) |
Asettaa rivien määrän. |
|
getRows() |
Palauttaa rivien määrän. |
|
setColumns(int) |
Asettaa sarakkeiden
määrän. |
|
getColumns() |
Palauttaa sarakkeiden
määrän. |
Ja sitten laskin esimerkki.
import java.awt.*;
import java.applet.*;
public class test extends Applet
{
public void
init()
{
setLayout(new GridLayout(3,4));
add(new Button("1"));
add(new Button("2"));
add(new Button("3"));
add(new Button("+"));
add(new Button("4"));
add(new Button("5"));
add(new Button("6"));
add(new Button("-"));
add(new Button("7"));
add(new Button("8"));
add(new Button("9"));
add(new Button("="));
setSize(320, 240);
setBackground(Color.white);
}
}
No ehkä laskin ei ollut kuitenkaan niin hirveä kutsuvan näköinen, mutta rakennellaan siitä parempi tämän luvun lopussa.
4.6
GRIDBAGLAYOUT
Tämä onkin sitten kaikkein vaikein layout. Tämä on myöskin erittäin ärsyttävä koodata. Kannattaakin käyttää jotain ohjelmaa kun rakentelet ohjelman pohjat esim. Jbuilder.
Muodostajia ei ole kuin yksi. Ja se toimii niin kuin muutkin. Tämä layout tosin kannattaa määritellä muuttujaan. Ja tämä käy ihan samoin kuin olion luonti. Layoutithan on olioita.
GridBagLayout pohja = new
GridBagLayout();
Säiliöön layout laitetaan normaalisti.
setLayout(pohja);
Tällä layoutilla on runsaasti ominaisuuksia, mutta layout on erittäin hankala käyttää. On puolittain mahdotonta saada tämä layout heti niin kuin haluaa (voi onnistua, tosin itse en ole). Layoutille annetaan eri ominaisuuksia muuttelemalla muuttujien arvoja. Tämän layoutin toimintaa voisi verrata vaikka HTML:n table osioon. Kirjoitus tapa on vain täysin erilainen.
GridBagLayout haluaa toimiakseen tukiluokan, joka GridBagConstraints. Tästä luokasta muodostetaan olio samalla lailla kuin olio yleensäkin.
GridBagConstraints c = new
GridBagConstraints();
GridBagConstraints luokkaan tallennetaan eri arvot, jotka vaikuttavat layoutin muotoon. Eli siis muutamme GridBagConstraints luokan muuttujien arvoja saadaksemme haluamamme muodon layoutille. Muuttujien arvojen muutos käy näin.
GridBagConstraints c = new
GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
Eli olion nimi on c, joka on muodostettu GridBagConstraints luokasta. Esimerkissä muutetaan GridBagConstraints luokan ominaisuutta fill. Sille annetaan arvoksi ilmeisesti final int tyyppinen GridBagConstraints luokan muuttujan arvo. Samalla tavalla toimii kaikki layoutin arvojen muutokset. No siirrytään nyt itse muodon muuttamiseen.
Aiemmasta esitys tavasta poiketen esittelen tämän paljon tarkemmin, koska tämä on huomattavasti muita vaikeampi.
Otetaan ensin fill muuttuja esiin. Ja ennen kuin aloitetaan esimerkki niin kerrotaan vähän tulevan ohjelman toiminnasta. Tässä ei muuta outoa ole kuin napin luonti, mikä tapahtuu metodissa teeNappi(). Oli mukavampi luoda nappi metodissa, koska se säästi paljon vaivaa (idea lainattu Javan omista ohjeista).
import java.awt.*;
import java.applet.Applet;
public class test extends Applet
{
GridBagLayout pohja = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
private void teeNappi(String nimi,
GridBagLayout gridbag,
GridBagConstraints c) {
Button nappi = new Button(nimi);
gridbag.setConstraints(nappi, c);
add(nappi);
}
public void
init() {
setLayout(pohja);
c.fill = GridBagConstraints.BOTH;
teeNappi("Nappi 1", pohja, c);
}
}
No niin meillä on nyt nappi ruudun keskellä (JEE). Miksi? Tämä on sen takia siinä, koska layout alkaa täyttää itseään keskeltä. Meillä oli myös määritetty fill muuttuja.
c.fill = GridBagConstraints.BOTH;
Mitä se oikein teki? Fill määrää miten näyttöalue täytetään. Meillä oli GridBagConstraints.BOTH arvo eli tämä tarkoittaa, että koko näyttöalue täytetään.
Kuva 4.5
No vielä ei fill arvon vaikutus näkynyt, mutta kun
annamme weightx tai weighty arvot niin johan huomataan eroa.
import java.awt.*;
import java.applet.Applet;
public class test extends Applet
{
GridBagLayout pohja = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
private void
teeNappi(String nimi,
GridBagLayout gridbag,
GridBagConstraints c) {
Button nappi = new
Button(nimi);
gridbag.setConstraints(nappi, c);
add(nappi);
}
public void
init() {
setLayout(pohja);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
teeNappi("Nappi 1", pohja, c);
}
}
Nyt tulos on nappi, mikä peittää koko Appletin. Näin käy koska nyt komponentin näyttöalue kasvoi koko Appletin kokoiseksi. Ja BOTH määräsi komponentin täyttävän koko näyttöalueen.
Seuraavaksi kokeillaan mitä tapahtuu kun BOTH muutetaan NONE arvoksi.
c.fill =
GridBagConstraints.NONE;
Saadaksemme paremman kuvan mitä tapahtuu niin luodaan ohjelman uusi nappi.
teeNappi("Nappi 2", pohja, c);
Kirjoita tuo aiemmin luodun napin jälkeen.
Kuva 4.6
Kuva esittää miten siinä käy. Nyt kun BOTH määrettä ei ole vaan meillä on NONE, mikä tarkoittaa samaa kuin ’ei mitään’. On siis selvää, että komponentti ei saa täyttää koko näyttöaluetta. Ja ohjelmassahan on nyt kaksi nappia eli Appletti jaetaan näille kahdelle napille. Seuraava kuva esittää miten näyttöalueet ovat nyt.
Kuva 4.7
Nyt siirrytään eteenpäin. Aseta BOTH arvo takaisin ja anna muuttujalle gridwidth arvo GridBagConstraints.RELATIVE. Tämä tarkoittaa rivin toiseksi viimeistä komponenttia. Luo sitten nappi 3. Tämän jälkeen aseta gridwidth arvo GridBagConstraints.REMAINDER. Tämä tarkoittaa rivin viimeistä komponenttia. Tämän jälkeen tulevat komponentit menevät seuraavalle riville.
import java.awt.*;
import java.applet.Applet;
public class test extends Applet
{
GridBagLayout pohja = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
private void
teeNappi(String nimi,
GridBagLayout gridbag,
GridBagConstraints c) {
Button nappi = new Button(nimi);
gridbag.setConstraints(nappi, c);
add(nappi);
}
public void
init() {
setLayout(pohja);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
teeNappi("Nappi 1", pohja, c);
teeNappi("Nappi 2", pohja, c);
c.gridwidth = GridBagConstraints.RELATIVE;
teeNappi("Nappi 3", pohja, c);
c.gridwidth = GridBagConstraints.REMAINDER;
teeNappi("Nappi 4", pohja, c);
}
}
Koodi on nyt tuollainen. Se tekee neljä vierekkäistä nappia. Tämän jälkeen tehdään uusi nappi, mikä peittää koko toisen rivin.
c.weighty = 1;
teeNappi("Nappi 5", pohja, c);
Lisää tuo koodin pätkä ohjelma koodin perään ennen } merkkejä. Ohjelma on kuvan kaltainen.
Kuva 4.8
Tehdään vielä yksi rivi. Siihen halutaan kaksi nappia. Ensimmäinen nappi on yhtä iso kuin ylimmän rivin kolme nappia. Viimeinen nappi on yhden napin kokoinen.
c.gridwidth = GridBagConstraints.RELATIVE;
teeNappi("Nappi 6", pohja, c);
c.gridwidth = GridBagConstraints.REMAINDER;
teeNappi("Nappi 7", pohja, c);
Siinä se tuon lisäät viiden napin teko koodin alle ennen } merkkejä. Ohjelman pitäisi olla kuvan näköinen.
Kuva 4.9
GridBagLayout pohjalla on enemmänkin mahdollisuuksia muutella muotoaan, mutta emme tarvitse niitä tässä kirjassa. Ne löytyvät ainakin Javan omista ohjeista.
LISÄÄ MUOTOJA
YHDISTÄMÄLLÄ
Layouteja voidaan yhdistellä. Tähän toimenpiteeseen tarvitaan paneeleja. Aiemmin teimme layouteja ja laitoimme niihin nappuloita. No tietenkin niihin voidaan laittaa mikä tahansa komponentti mukaan lukien paneeli. Mainitsikin jo, että paneeliin voidaan säilöä layout eli voimme tehdä sisäkkäisen pohjan.
import java.awt.*;
import java.applet.Applet;
public class test extends Applet
{
Panel p = new Panel();
BorderLayout kehys = new BorderLayout();
GridLayout verkko = new GridLayout(1,2);
public void
init() {
setLayout(verkko);
p.setLayout(kehys);
p.add(new Button("Keski"),
"Center");
p.add(new Button("Ala"), "South");
p.add(new
Button("Ylä"), "North");
p.add(new Button("Oikea"), "East");
p.add(new Button("Vasen"), "West");
add(p);
add(new
Button("Toinen osa."));
}
}
Tässä oli layoutit. Kuten huomaamme voimme luoda layouteilla erittäin monia pohjia. Ainut vika vain on, että nämä ovat todella hankalia koodata. Ja kuten jo sanoinkin, niin kannattaa tehdä pohjat jollain ohjelmalla. Jbuilder ohjelmassa voi tehdä pohjat graafisesti. Ohjelman tämä osuus ei kyllä ainakaan pidennä hiuksia (niiden jatkuvasta kisokonnasta johtuen), mutta on sekin mukavampi tapa kuin kirjoittaa ne itse. Parasta olisi tietysti jos teet itse tällaisen ohjelma jolla voi tehdä pohjat, mutta minä ainakin säästän vaivojani ja käytän Jbuilderin rakennus systeemiä. Samassa säästän myös parturin hinnan.
Ikkunoiden kanssa olet ainakin ollut aiemmin tekemisissä. Ikkuna eli window on Windowsin peruselementti. Siitä on myöskin Java olio. Me käymme tässä luvussa läpi hiukan ikkunoiden käyttöä.
Kuva 5.1
Ikkunan luonti ei ole kovinkaan vaikeaa. Meidän tarvitsee vain periä Frame-luokka, joka kuuluu component-luokkaan. Yksinkertaisen ikkunan luonti tapahtuu näin.
class main
{
public static void main(String args[]) {
ikkuna win = new ikkuna("Joo tämä on
ikkuna !!!");
}
}
import java.awt.*;
import java.awt.event.*;
class ikkuna extends Frame implements
WindowListener
{
public
ikkuna(String title) {
super(title);
setSize(320, 240);
addWindowListener(this);
show();
}
public void
windowClosing(WindowEvent e) {
setVisible(false);
dispose();
System.exit(0);
}
public void windowActivated(WindowEvent
e) {}
public void windowClosed(WindowEvent
e) {}
public void
windowDeactivated(WindowEvent e) {}
public void
windowDeiconified(WindowEvent e) {}
public void
windowIconified(WindowEvent e) {}
public void
windowOpened(WindowEvent e) {}
}
Kuten huomasimme ikkunan luonti on hyvin yksinkertaista. Ikkuna-luokkaa voidaan kaiken lisäksi käyttää, myös Appletissa aivan samoin. Ainoat muutokset tulevat main-luokkaan.
class main
{
public void
init()
ikkuna win = new ikkuna("Joo tämä on
ikkuna !!!");
}
}
Ikkuna tarvitsee tapahtumien käsittelyyn WindowListener rajapinnan. Rajapinnoilla ohjelmoitaessahan piti ylikirjoittaa kaikki rajapinnan metodit.
Ohjelmassa toteutetaan vain yksi rajapinnan metodi windowClosing(). Tämä tapahtuma aiheutuu ikkunan sulkemisesta, jos metodia ei kirjoiteta ei ikkuna myöskään sulkeudu. Ei saa myöskään unohtaa System.exit(0) riviä, joka sulkee koko ohjelman. Ilman tätä jäädään Dos-kehotteeseen eikä ohjelman suoritus lakkaa.
Frame-luokalla on metodeita, joita tarvitaan ikkunan asetuksien muuttamiseen.
|
dispose() |
Hävittää ikkunan. |
|
getIconImage() |
Palauttaa ikkunan ikonin. |
|
getMenuBar() |
Palauttaa ikkunan
valintapalkin. |
|
getTitle() |
Palauttaa ikkunan otsikon. |
|
isResizable() |
Palauttaa arvon true,
jos ikkunan kokoa voidaan muuttaa. False taas palauttuu, jos kokoa ei
voida muuttaa. |
|
remove(MenuComponent) |
Poistaa valikkopalkin. |
|
setCursor(int) |
Asettaa kursorin. |
|
setMenuBar(MenuBar) |
Asettaa valikkopalkin. |
|
setResizable(boolean) |
Asettaa koon muutoksen
päälle/pois. |
|
setTitle(String) |
Asettaa ikkunan otsikon. |
Ikkunalla on myös kaksi muodostajaa. Esimerkki ohjelmassa käytimme alempaa muodostajaa.
|
Frame |
Luo ikkunan. |
|
Frame(String) |
Luo ikkunan ja sille
otsikon. |
Ikkunoiden käytöstä tulee lisää tämän luvun viimeisessä osassa.
Dialogi on karsittu ikkuna. Dialogin tehtävä on yleensä ilmoittaa käyttäjälle ohjelman tekemästä toiminnasta. Olet varmasti kohdannut tilanteen jossa ohjelma kysyy haluatko varmasti sammuttaa ohjelman. Tämä pikku ikkuna on dialogi. Näitä dialogeja ei kannata liian hanakasti käyttää, koska se tekee ohjelmasta hitaan käyttää. Se ei myöskään ole käyttäjälle mitenkään kivaa, jos joka kohdasta pamahtaa esiin ikkuna mikä kysyy haluatko tehdä jotain. Windowsia käyttäessä tulee vähän väliä ruutuun ikkuna mikä kysyy varmistuksen (yleisempi ainakin Windows 98:ssa taitaa olla ’laiton toiminto tai virhe muistipaikassa) johonkin toimintoon. Minä en ainakaan viitsisi painella Ok nappia, joka hetki. Eli käytä näitä järjellä.
Dialogin luonti yksinkertaisimmillaan on todella helppoa.
public void windowOpened(WindowEvent e)
{
Dialog dialogi = new Dialog(this, "Dialog",
false);
dialogi.show();
}
Kun lisäät tuo koodin edelliseen ohjelmaan windowOpened tapahtumaan niin näet mitä tapahtuu.
Nyt teemme dialogin jonka lisäämme edelliseen ohjelmaamme. Tee uusi luokka nimeltä ViestiLaatikko näin.
import java.awt.*;
import java.awt.event.*;
class ViestiLaatikko extends Dialog implements
ActionListener, WindowListener {
BorderLayout borderLayout1 = new BorderLayout();
FlowLayout flowLayout1 = new FlowLayout();
Panel panel1 = new Panel();
Button button1 = new Button();
Button button2 = new Button();
Label label1 = new Label();
public ViestiLaatikko(Frame ikkuna,
String otsikko, String ilmoitus, boolean multi) {
super(ikkuna,
otsikko, multi);
setLayout(borderLayout1);
setSize(400, 106);
label1.setFont(new Font("Dialog", 0,
20));
label1.setAlignment(1);
label1.setText(ilmoitus);
add(label1, BorderLayout.NORTH);
panel1.setLayout(flowLayout1);
add(panel1, BorderLayout.CENTER);
button1.setLabel("Kyllä");
button2.setLabel("
En ");
button1.addActionListener(this);
button2.addActionListener(this);
addWindowListener(this);
panel1.add(button1, null);
panel1.add(button2, null);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button1) {
setVisible(false);
dispose();
}
if(e.getSource() == button2) {
setVisible(false);
dispose();
System.exit(0);
}
}
public void
windowClosing(WindowEvent e) {
setVisible(false);
dispose();
}
public void
windowActivated(WindowEvent e) {}
public void
windowClosed(WindowEvent e) {}
public void
windowDeactivated(WindowEvent e) {}
public void
windowDeiconified(WindowEvent e) {}
public void
windowIconified(WindowEvent e) {}
public void
windowOpened(WindowEvent e){}
}
Tuntuuko työläältä? No aivan varmasti tuntuu ainakin alussa, mutta dialogin luonti on loppujen lopuksi hyvin helppoa. Tietysti dialogiin kannattaa tehdä metodi mikä palauttaa jonkin arvon riippuen mitä nappia painaa. Tällöin saadaan yhdelle pohjalle enemmän käyttömahdollisuuksia.
Nyt ollaankin aiheessa, jota varmasti tarvitaan paljonkin tulevaisuuden Java Appletissa. Grafiikka on tunnetusti netissä hyvin käytettyä ja onkin mielestäni erittäin hyvä, että sitä käytetään. Yleinen mielipide kuitenkin on, että sivut on hyvät jos niistä löytyy haluttu asia. grafiikalla ei ole mitään merkitystä.
No näin on nyt, mutta kuinka onkaan parin vuoden päästä. Minä ainakin tykkään siitä, että sivulla on kuvia. Onhan selvää, että sivua jossa on kuvia on mukavampi käyttää. On muutenkin paljon mukavampi lukea tekstiäkin kun välillä on kuva jostain tekstiin liittyvästä asiasta. Kuva muutenkin selittää tuhat kertaa paremmin kuin teksti. Ja kun yhdistämme nämä kaksi niin voihan (tuota) ’kettu’. No joo, jospa lopettaisin tämän turhan jauhamisen ja mentäisiin itse asiaan eli grafiikka-ohjelmointiin.
Tässä luvussa tulee vastaan monia Javan graafisia ominaisuuksia, jotka ovat kieltämättä ihan ’jees’. Javassa on helpotettu huomattavasti grafiikan luontia. Verrattuna vaikka C kieleen. Javassa ei tarvitse itse viitata mihinkään muistipaikkoihin eikä palettien muuttaminen myöskään vaadi omatoimista muistien ropelointia. Tämä ei tosiaankaan ole ainut asia, joka on helpotettu. Javalla on tiettyjä filtteri luokkia, joilla voidaan muokata verkosta ladattuja kuvia. Vaikka grafiikka ohjelmointia onkin yritetty helpottaa niin muutos ei kuitenkaan ole mikään järkyttävän suuri. Samoja toimituksia tehdään Javassa kuin C kielessäkin grafiikka ohjelmoinnissa. C kielessä vain tiedot tungetaan suoraan näyttömuistiin alkaen kohdasta A000. Javassa ei vain tarvitse välittää muistista pisteiden arvot tungetaan kuva matriisiin mikä vastaa periaatteessa näyttömuistin käyttöä. C kieli käyttää siis suoraan näyttömuistia ja on tästäkin syystä huomattavasti Javaa nopeampi. Suurin syy Javan hitauteen on kuitenkin pohjasta riippumattomuus. Javalla on kuulemma kääntäjä, mikä pääsee lähelle C:n nopeutta. Tässä ei kuitenkaan ole pohjasta riippumattomuutta. Eli Javan tärkein valtti on poissa. Oli miten oli, mutta me teemme niin optimaalista koodia ettemme tarvitse lisä nopeutta. Tai jos me nyt vaan yritetään saada haluttu asia tehtyä ja jätetään optimointi muiden harteille.
Geometria on minusta erittäin mielenkiintoista. Onpa se vielä erittäin hyödyllistäkin joissain ohjelmissa. Varsinaista laskentaa ei tässä osassa tarvita. Me aiomme käyttää vain Javan valmis luokkia, mutta myöhemmin toisessa tutoriaalissa (Grafiikkaa Javalla) teemme ihan omia geometria luokkia. Voin melkein nähdä miten jo odotatte graffan ohjelmoinnin aloittamista. Anteeksi vain, mutta minun täytyy kertoa teille vielä huimasti teoriaa ennen ensimmäisenkään rivin kirjoitusta.
No jaa, jospa jätämmekin teorian väliin ja siirrymmekin heti ohjelmoimaan grafiikkaa.
Neliö
Neliö on kaikille tuttu muoto. Tällaista saatetaan joskus tarvita jossain ohjelmassa, joten otetaanpa koodia esiin.
import java.applet.*;
import java.awt.*;
public class graffa extends Applet {
public void
init() {
setSize(320,240);
setBackground(Color.white);
}
public void
paint(Graphics g) {
g.setColor(Color.black);
g.drawRect(10,10,100,100);
}
}
Yllä oleva ohjelma luo mustan laatikon paikkaan X=10 ja Y=10. Laatikko on 100 pikseliä korkea ja 100 pikseliä leveä.
Nyt kun olemme jo ottaneet ensimmäisen askeleen kohti grafiikka ohjelmointia lienee syytä kertoa hieman teoriaa.
Grafiikka siis piirretään piirtopinnalle. Piirtopinta voi olla vaikka paneeli. Esimerkki ohjelmassa Appletin pohja oli piirtopinta. Grafiikan piirtoon käytetään Graphics-luokan metodeita. Esimerkissä käytimme kahta Graphics-luokan metodia setColor() ja drawRect(). Ensimmäinen määrää ’kynän’ värin ja viimeinen huolehtii neliön piirrosta. Kaikki piirto metodit toimivat samaan tapaan. Väriä ei tietenkään tarvitse määritellä uudelleen, jos ei halua muuttaa ’kynän’ väriä.
Esimerkki ohjelmassa piirto tapahtui paint() metodissa. Se ei ole välttämätöntä, mutta se on mielestäni selvin tapa. Me siis teemme kaiken piirron paint() metodissa.
No niin eiköhän taas riitä teoria. Me haluamme seuraavaksi ympyrää ruutuun.
Ympyrä
Ympyrä eli englanniksi circle. Ympyrän piirto ei ole ollenkaan sen kummempaa kuin neliönkään. Piirto tapahtuu aivan samoin, vain rivi g.drawRect(10,10,100,100); pitää muuttaa riviksi g.drawOval(10,10,100,100);.
Kuva 6.1
Ympyrän metodi on itse asiassa samalla lailla toimiva kuin neliönkin eli
g.drawOval(x paikka, y paikka, leveys, korkeus). Myöhemmin sitten näemme kuinka teemme ympyrän piirtorutiinin itse, mutta se tosiaan myöhemmin tässä luvussa.
Viiva
Line eli viiva. Viivoja voidaan tarvita paljonkin riippuen tietysti mitä teet. Viivan piirto on kuitenkin todella helppoa. Metodille drawLine() annetaan viivan alku- ja loppu piste, siinä se. Voit testata viiva helposti seuraavalla esimerkillä. Esimerkki on sama kuin aiemmin, mutta nyt piirto metodi on viivan piirto.
import java.applet.*;
import java.awt.*;
public class graffa extends Applet {
public void
init() {
setSize(320,240);
setBackground(Color.white);
}
public void
paint(Graphics g) {