Java GUI(swing) 2.del

Tags:    java
Skrevet af Bruger #15301 @ 29.09.2011

Indledning


I denne artikel, vil vi arbejde videre på, hvad vi fik lavet i den første artikel. Kort sagt, vil vi have en lommeregner, der kan pluse og minuse, det input brugeren taster ind (dog med visse begrænsninger, hvor du selv har muligheden, for at folde dig ud og lave en bedre udgave :) )

Forudsætninger
1) Du skal have lysten, til at følge denne tutorial.
2) Du skal have gennemgået den første del "Java GUI(swing) 1.del"
eller have en basis forståelse for swing
3) En forståelse af nedarvning i java.

Lidt Basis viden omkring ActionListeners


Den eneste ting, vi mangler at komme ind på, for at kunne lave en lommeregner, er hvordan man tjekker, om der er klikket på nogle knapper. I swing gøres dette oftest ved brug af ActionListeners, men dette kan dog gøres på andre metoder, som f.eks. ved brug kombineret brug af en MouseListeners og en MouseMotionListener(Disse kommer vi dog ikke nærmere ind på i denne artikel). En ActionListener virker ved, at det er et interface, som kun indeholder metoden "public void actionPerformed(ActionEvent e)". Der er den metode, der bliver kaldt, når der bliver trykket på for eksempel en JButton, der har en actionListener tilknyttet til sig selv. Da en JButton kun, kan udføre den kode, den har fået at vide, at den skal udføre. Er det derfor vigtigt, at man husker, at tilknytte den actionListener, til den rigtige knap. Dette gøres med metoden "addActionListener(ActionListener l)". Til at gøre dette, er der to forskellige metoder man kan benytte.
Den ene metode er, at man kan lave en anonym indre klasse, som man tilknytter til ens knap direkte.
Fold kodeboks ind/udJava kode 


Den anden metode, man kan benytte sig af, er at lave sin helt egen klasse, der implementerer ActionListener interfacet, og derefter tilknytte sin egen klasse til de knapper man har lyst til at tilknytte den til. Et godt sted, at gøre dette er hvis, man har flere knapper der ca. skal udføre den samme kode.

Fold kodeboks ind/udJava kode 


Fold kodeboks ind/udJava kode 



Et overblik over, hvad der sker når man klikker på en knap

Opgaven og løsningen


Da vi allerede fik lavet alt grafikken, i vores forrige afsnit; mangler vi nu bare at nævne, hvad der skal ske når en bruger indtaster input, og få vores funktion til at virke, så hensigtsmæssig som mulig. Det mål vi sætter for denne applikation, er at selve betjeningen af lommeregneren, skal minde om den, brugeren allerede kender fra standard lommeregneren i windows. Hvor brugeren, blot kan taster på tal og skrive tegnene plus eller minus foran de værdier, for at brugeren til sidst kan se, det samlede regnestykke, han gerne vil have udført. Når brugeren så er tilfreds med regnestykket, trykkes der blot på "Enter" og så udregner lommeregneren stykket, og viser så det endelige resultat.

For at opnå alt dette, vil vi dele denne opgave op i flere dele.
1) Få knapperne til at virke, hensigtsmæssigt ved at klikke med musen.
2) Få lommeregneren til faktisk, at kunne regne.
3) Få lommeregneren til at fungerer, ved at man trykker på knapperne.

Få knapperne til at virke


For at computeren, ved hvilken kode du gerne vil have til at ske, når du klikker på de forskellige knapper. Skal man tilknytte en "ActionListener" listener til, hver knap. Dog kan man sagtens genbruge den samme ActionListener på de forskellige knapper, og så inde i selve ens AktionListener kan man definerer, hvad der skal ske, alt afhængigt af, hvilken knap der er blevet trykket på. Da vi benytter os af denne tilgang, deler vi vores applikation op i to forskellige klasser, den første "ButtonListener" der er vores egen aktionlistener og vores "Frame" klasse fra "Java GUI(swing) 1.del". Men det var vidst også en lidt lang, snak om hvordan det virker, nu er det vidst på tide, at vi får kodet lidt og kommer videre med vores lommeregner.

Her kommer koden for vores ButtonListener
Fold kodeboks ind/udJava kode 


Og Her er koden for vores Frame
Fold kodeboks ind/udJava kode 


Få lommeregneren til at kunne regne


Nu da vi faktisk, har alt layoutet på plads og kan skelne imellem, hvilke knapper, der bliver trykket på, så er det på tide, at give lidt intelligens til vores applikation. Med intelligens menes dog, kun evnen til at kunne benytte sig af, de basale regneregler "plus" og "minus". Dette kunne dog, umindbart lyde ligetil, og det er det næsten også. Det er jo sådanne med programmering, at der er ufatteligt, mange måder man kan opnå, det samme på. Denne løsning jeg kommer med her, er kun en af de utallige mange mulige løsninger der findes. Du kan muligvis, selv lave en bedre og kortere kode; hvis du lægger dit hoved i blød og tænker grundigt over, hvad det er vi forsøger at gøre. Men for at komme videre i dagens tekst, så lad os først analyserer, hvad vi forventer, at vores lommeregner skal kunne.

En kort analyse af simple regnestykker
Når man gerne vil regne med lommeregneren, er her et par eksempler, af hvad de fleste brugere vil skrive, når de benytter sig af en lommeregner.

Brugeren skriver Lommeregnerens svar
"2+2" 4
"2+2-50" -46
"-50+300" 250
"-500+300-500" -700

I det første eksempel, skal de to tal, der er adskilt af + lægges sammen. I det andet eksempel skal de to første tal lægges sammen, da de er adskilt af et plus, og det tredje tal, der er adskilt af de andre med et minus skal trækkes fra. I det tredje eksempel, skal 50 trækkes fra, og der skal lægges 300 til.
Vi har altså en situation, hvor at det er det symbol, der kommer før vores tal, der bestemmer, hvad vi skal gøre med vores tal.

Udfordringen
Dette virker jo næsten ligetil, at gøre, bare at se på hvilket symbol, der er foran tallet, og så ellers lægge tallet fra eller til vores resultat. Problemet består i, at vores input fra brugene modtager vores program som en String, og vi skal herefter til at splitte vores input korrekt op, før at vi kan bruge det ordentligt. En af de muligheder, vi har er at benytte os af String objektets indbygget "split" metode. Denne metode returnerer et array af Strings, hvor vi har defineret at Stringen skal splittes. Denne metode vælger jeg ikke, at benytte mig af, da man kun kan splitte en karakter adgangen. Det vil sige, at vi først skulle igennem, en split med plus og derefter for hver String vi ville få med plus, skulle vi også igennem en split med minus. Den metode, vi vil benytte os, af er at tjekke Stringen igennem, for hvert symbol, og hvis der findes et symbol på den plads vi er ved, så ved vi, at der er et tal efterfulgt at symbolet, indtil det næste symbol. Og på denne måde ville vi kører hele Stringen igennem, og så lægge de rigtige tal til og fra, og dermed få det korrekte resultat.

Dette var en længere smøre, så for at få en opsummering af dette, kan I se java koden, for at gøre vores lommeregner lidt mere intilligent her.
Fold kodeboks ind/udJava kode 


FejlSikring
Nu da, vi har fået gjort, vores lommeregner lidt intelligent, så er det vidst på tide, at vi sikrer os, at vi stort set, kun kan få korrekt input fra brugeren. Dette gør vi igen, i vores AktionListener, ved at lave en Try-Catch statement uden om vores udregning, for så derefter, at forsøge, at korrekte vores brugers input(I dette eksempel, fjerner vi blot, det sidste symbol, hvis brugeren er kommet til at indtaste "22+32++". Efter at vi har fået "Fejl sikret vores lommeregner, ser koden for ButtonListeneren således ud.
Fold kodeboks ind/udJava kode 


Få lommeregneren til at fungerer


Nu da vi har en lommeregner, der kan regne og er lidt fejlsikret, så er det på tide, at vi begynder at tænke, på hvordan det er nemmest og mest intuitiv, for brugen at benytte sig af vores lommeregner. En af de ulemper, Som den opmærksomme læser, har lagt mærke til, er at man ikke blot kan taste, på knapperne, og så trykke på Enter for at få svaret. Man kan dog, indtaste sine tal, med plus og minus og trykke på gange og dividerer, og få dette ind og få lommeregneren til at regne(men så regner den oftest forkert). For at undgå disse små ulemper, vil vi kun lade brugen indtaste, de inputs vores lommeregner kan regne på, og give det rigtige resultat. Dette gør, vi ved at benytte os af noget, der minder om vores AktionListener, som hedder en KeyListener denne klasse får vi vores Frame klasse til at implementerer, og får på den måde alle key-tryk til at gå igennem os, så vi kan tjekke at brugerne kun kan indtaste de inputs vi bestemmer. Men nu er jeg vidst begyndt, på en lidt for lang tale igen, så mon ikke vi hellere, skal se på koden for, hvordan det endeligt ser ud.

Vores Button Listener
Fold kodeboks ind/udJava kode 


Og vores Frame
Fold kodeboks ind/udJava kode 


En lille forklaring af, hvordan en KeyListener virker
For at benytte sig af en KeyListener, skal man have en klasse, der implementerer KeyListener klassen, (ligesom vores Frame implementerede KeyListener) Derudover, skal man tilføje hvilke elementer at denne KeyListener, skal fungerer på, ligesom da vi definerede satte vores Frame til at lytte til sig selv, med "this.addKeyListener(this);" som er et eksempel på dette. Ligesom med vores AktionListener, kan man også bruge den samme KeyListener på flere elementer. Lige en sidste ting, der skal nævnes om KeyListeners er, at for at de virker, kræver det, at det element de er tilknyttet har focus, ligesom vi gjorde da, vi benytte os af metoden "frame.requestFocus();" i vores ButtonListener.


Et billed af vores endelige lommeregner

Runable JAR file


Nu da vi har lavet en lommeregner, der virker via gui, ville det ikke være særligt brugervenligt, hvis vores brugere(højst sandsynligvis os selv) skal ind til cmd, og først finde stien til vores lommeregner, før de kan benytte sig af vores program. Det ville være noget nemmere, hvis vi havde en fil vi bare kunne dobbelt klikke på, og så ville vores program starte. Dette har java heldigvis, en mekanisme til at gøre, desværre er denne mekanisme, ikke helt optimal, da man for eksempel ikke kan have et ikon på sin .jar fil. Der findes metoder til at komme udover dette problem, blandt andet ved at lave en installer, eller at lave en .exe fil der kører ens java program. Men for øjeblikke er det nok for os, at få lavet vores program om, fra kun at kunne kører fra cmd til, også at kunne kører via en fil på computeren.

Dette kan forholdsvist simpelt gøres ved at man benytte sig af programmet "jar.exe" der kommer med når man downloader sin version af jdk. Men som ethvert andet program, skal det vide hvad det skal gøre, før det kan udføre det. Processen med at lave en runnable .jar file kan deles ind i 3 dele.

1) Skrive sin manifest-fil
2) give jar.exe de rigtige argumenter
3) Køre sit program

For at lave en manifest fil kan man benytte sig af en text editor.
I denne editor skriver man så følgende:
" Main-Class: Frame
"

PS: Det er vigtigt, at ende sin fil, med en ny linje, da filen ellers ikke vil blive læst korrekt.

Dette gemmes så som et text dokument f.eks "Manifest.txt" i samme mappe, hvor man har de .class filer, som man gerne vil inkluderer i ens .jar fil.

For at give en jar.exe starter man med at sikrer sig, at man har sat en path til "C:\Program Files (x86)\Java\jdk1.6.0_27\bin" eller hvor din jdk nu måtte befinde sig på din computer. Herefter åbner man en kommandopromt til stien, hvor ens java projekt befinder sig, og til den mappe, hvor man har sine .class filer.


Et billed af cmd, inde i mappen med .class filerne

Når man har sikret sig at man har sat sin windows PATH korrekt, og man er inde i den rigtige mappe skal man give ens kommandopromt følgende parametre.
"jar cfm Calculator.jar Manifest.txt *"


Et billed af cmd med parameterne til jar.exe


Hvor jar er det program du starter og resten er de argumenter du starter programmet med.
"cfm" 'c' står for at man vil lave en .jar file og 'f' indikerer, at du gerne vil have output til en fil i stedet for til stdout, og 'm' står for, at man gerne vil merge information til den eksisterende manifest fil.

"Calculator.jar" er det navn, man giver sin .jar fil.

"Manifest.txt" er den fil man gerne vil merge den eksisterende manifest fil med.

"*" står for at man includerer alle de filer, der er i den mappe man er i til .jar filen.


Et billed af vores mappe, efter vi har lavet vores .jar fil

Herefter er det blot at kører filen, ved at dobbelt klikke på den, og så kan du nyde din indsats i at lave et helt program fra bunden af :)


Et billed af vores lommeregner, køre via vores .jar fil


Konklusion


Tillykke, du har nu lavet din første lommeregner, og har igennem forløbet, lært en masse om swing, og måske også en smule mere java end du kunne før. Efter denne tutorial, af to dele skulle du meget gerne have en grund forståelse af swing, og have lysten til at lave/lære mere med swing.
Med denne viden kan du stort, set lave alle de programmer til din pc, som du ønsker at lave, kun fantasien,computeren og mest af alt, hvor meget tid du vil afsætte sætter grænser for, hvad du kan programmerer.
Dog skal det, nævnes at selvom man kan lave, ting med java og swing, så er det muligt, at der er andre teknologier, der er bedre til at lave andre ting (f.eks) 3D programmering, er swing ikke lige det bedste til.


Forfatters note
Tak for din tid til at læse, denne tutorial igennem, jeg håber du har nydt den, at læse den ligeså meget og mere til end jeg har nydt at lave den :). Tiltrods for, at der ikke har været særligt mange billeder, til denne anden del.




Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (8)

User
Bruger #4487 @ 01.10.11 11:07
Er den tredje del på vej?? :P
User
Bruger #8782 @ 13.11.11 23:25
Selve artikel-titlen må gerne ændres, så den indeholder mellemrum lige som del 1. Og ja, tags mangler også for titlen :D ellers en god artikel.
User
Bruger #15301 @ 15.11.11 16:20
ja, jeg opdagede det først efter, at jeg havde sendt den ind, og var blevet godkendt især det med tagsne :).. Men, da det ville kræve at den skulle godkendes engang til, har jeg tænkt på at vente med at rette fejlene, indtil den næste artikel i serien kommer :)
User
Bruger #15301 @ 15.11.11 16:20
ja, jeg opdagede det først efter, at jeg havde sendt den ind, og var blevet godkendt især det med tagsne :).. Men, da det ville kræve at den skulle godkendes engang til, har jeg tænkt på at vente med at rette fejlene, indtil den næste artikel i serien kommer :)
User
Bruger #8782 @ 18.11.11 09:13
Bed eventuelt Kasper (admin) om at rette alle fejlene.. :)
User
Bruger #4487 @ 17.03.12 08:59
Hej Kevin er der en tredje på vej?

Ville gerne vide noget mere om gridbag layout og cardlayout :)
User
Bruger #20939 @ 22.10.16 14:34
Når jeg prøver at lave .jar filen siger den:

'jar' is not recognized as an internal or external command,
operable program or batch file.

Jeg har installeret Java SE Development Kit 8u111. Burde den ikke kunne gøre det?
User
Bruger #20939 @ 22.10.16 17:32
Jeg har fundet ud af det :D
Du skal være logget ind for at skrive en kommentar.
t