Notice: Undefined index: treeid in /home/blinkenlights/public_html/commands/TreeDetailsCommand.php on line 50
Blinkenlights.se - Java 5 för nybörjare - Programmering & spelutveckling

BETA


Notice: Undefined index: treeid in /home/blinkenlights/public_html/view/TreeDetailsView.php on line 60

Java 5 för nybörjare

Tillbaka till artikelarkivet

Filer

Verktyg

Kommentarer (7)
Utskriftsvänligt format

Betyg

markedunmaked 5.9

Detta är en enkel nybörjarguide i Java. Guiden kommer att inrikta sig på att skapa sk Applets så att vi snabbt kan komma till de lite roligare bitarna av programmeringen.

Navigation:

< Föregående del || Nästa del >

Text - 04 - GUI

GUI



I den här delen ska jag visa har man gör ett GUI, Graphical User Interface, alltså ett grafiskt gränssnitt på svenska. Det är alltså en massa grafiska komponenter som gör att programmet kan kommunicera med användaren. Det kan t ex låta användaren trycka på en knapp för att något intressant ska hända.

Vi börjar med ett litet program med några enkla komponenter:
  1.  
  2. import java.applet.*;
  3. import java.awt.*;
  4.  
  5. public class NewApplet extends Applet {
  6. public void init() {
  7. Label lb = new Label("Hej");
  8. add(lb);
  9. Button button = new Button("Knapp");
  10. add(button);
  11. }
  12. }


Det vi gör är alltså att vi skapar ett par objekt utav några olika klasser. Precis som du fick lära dig i förra delen. Det finns t ex en klass som heter Label, med den klassen gör vi objektet lb. Det som kan vara nytt här är att vi anger ett argument till Label när vi skapar vårat objekt, precis som när vi anropar en metod. Argumentet vi skickar är en liten bit text, denna text kommer sedan att skrivas ut på skärmen. Label är nämligen en klass för att skriva ut text på skärmen. Sedan kommer en intressant rad, nämligen add(lb); Den gör så att vårat objekt lb kommer att läggas till i fönstret. Om du tar bort den raden kommer våran label inte att synas.

Vi gör även en knapp på ett mycket liknande sätt. Knappen kommer dock inte att göra något, då vi inte bett den att göra något.

För att få knappen att göra något måste vi implementera en händelselyssnare (eng. actionlistener). Detta kan vi göra på två sätt. Antingen gör vi så att våran appletklass bygger ut sig med de saker som behövs för att det ska bli en händelselyssnare, eller så gör vi en ny klass som bara är en händelselyssnare. Det smidigaste sättet just nu är att bygga ut våran klass så att det blir en händelselyssnare.

Som vet så börjar våran programkod med EURpublic class NewApplet extends AppletEUR. Jag har hoppat över att förklara detta tills nu. Detta betyder i princip att våran klass NewApplet bygger vidare på klassen Applet. Inom objektorienteringen brukar man säga att man ärver klassen Applet. Vad detta gör i praktiken är att våran klass får en massa egenskaper som klassen Applet har. Sedan tar vi alla de där färdiga sakerna vi får från början och bygger vidare på. Utan detta hade det blivit otroligt mycket mer kod att skriva.
Eftersom våran klass bygger vidare kan vi skriva saker som add(button); Detta fungerar bara på vissa klasser. Nämligen de klasserna som har metoden add. Vi har själva inte skrivit metoden att, utan den får vi allderles färdig när vi skriver EUREUR extends AppletEUR. Att vi har en paint-metod som tar ett argument av typen Graphics har också med detta att göra.
Hur som helst så ska vi nu bygga in en händelselyssnare i vårat program också. Och eftersom vi är så lata och inte orkar skriva all kod för en händelselyssnare så ber vi bara Java att ta och bygga in en händelsehanterare i våran klass. Ungefär som vi gjorde med extends Applet. Men man kan bara bygga vidare på en klass med extends. Vill man ta in ytterligare en klass får man skriva implements enTillKlass.

Klassen vi ska bygga vidare på (implementera) heter ActionListener. Den finns inte med bland de klasser vi importerat så vi måste importera ännu flera klasser. Lägg till den här raden i början på din kod:
  1.  
  2. import java.awt.event.*;


Sedan ska vi lägga till EURimplements ActionListenerEUR till den första raden i våran klass. Den kommer alltså se ut såhär:
  1.  
  2. public class NewApplet extends Applet implements ActionListener {


Nu är det bara två saker kvar, den ena är att vi ska skapa en metod som anropas när en händelse utförs. Denna metod kan se ut såhär:
  1.  
  2. public void actionPerformed (ActionEvent ae) {
  3. System.out.println("Du tryckte på en knapp!");
  4. }

Lägg in den koden efter att du avslutar init-metoden.

Nu är vi redo för att faktiskt knyta en komponent till våran händelselyssnare. Den enda komponenten vi har som användaren kan interagera med är en knapp, så vi tar den. Att EURknytaEUR en händelselyssnare till en komponent görs såhär:
  1.  
  2. button.addActionListener(this);


Denna kod ska du lägga in precis efter add(button); i init-metoden. Det vi gör är helt enkelt att knyta händelselyssnaren EURthisEUR till objektet button. Men vänta nu! Vadå EURthisEUR? Vem är det? Jo, det är den klassen som vi är i. Eftersom vi har byggt in en händelselyssnare i klassen vi är i kan vi ange den som händelselyssnare. Hade vi använt en extern klass som en händelselyssnare hade vi angett ett objekt utav den klassen istället för att ange EURthisEUR.

Det som kommer hända om du nu kör programmet (Shift+F6) är att precis samma saker som kom upp i vårat första program i den här delen kommer upp. Men klickar du på knappen så kommer det stå EURDu tryckte på knappen!EUR nere i textfältet i NetBeans.

Nu är det läge för att du leker lite själv igen. Skapa en till knapp och knyt samma händelselyssnare till den och se vad som händer då.

Du kommer nu att stöta på ett lite oönskat beteende. Oavsett vilken knapp du trycker på så kommer samma sak hända, vilket kanske inte är det du vill i alla fall. Lösningen på detta problem kommer här.

Det första du måste göra är att förstå lite om objekt och variabler. Om vi säger att du skapar en int-variabel i en metod, såhär:
  1.  
  2. public void metod() {
  3. int ettTal;
  4. }

Så kommer den variabeln bara finnas inuti den metoden. Skapar du en till metod efter den här och anropar den kommer du inte att kunna använda variabeln ettTal. Det är därför man skickar en massa saker som argument och skickar returvärden och sådant. Detsamma gäller med objekt. I vårat program skapade vi ett objekt button av klassen Button i våran init-metod. Denna knapp kommer inte att kunna användas av någon annan metod, problemet är bara det att vi vill använda det objektet i våran actionPerformed-metod för att avgöra vilken knapp det var som trycktes på så att man sedan kan ge olika resultat beroende på vilken knapp man har tryckt på. Man kan därför skapa variabler/objekt som alla i hela klassen kan komma åt. Detta gör man såhär:
  1.  
  2. public class EnKlass {
  3. private int ettTal;
  4. public void EnKlass() {
  5. ettTal = 5;
  6. Metod();
  7. }
  8. public void Metod() {
  9. System.out.println(ettTal);
  10. }
  11. }

Den där koden borde fungera allderles utmärkt med några imports. Något som däremot inte skulle ha fungerat vore om man skapade ettTal-variabeln i EnKlass-metoden. Då skulle inte kunna nå den från metoden Metod.

Det är även värt att lägga märke till att jag skrev private innan int ettTal; Detta betyder att variabeln är privat för den här klassen och andra klasser kan inte komma åt den. Hade jag däremot skrivit public som framför metoderna så hade alla klasser kunnat gå in och ändra i den variabeln hur som helst. Detta har med objektorienteringens principer att göra och du behöver inte oroa dig så mycket över det nu, bara kom ihåg att göra variabler private och funktioner public.

Om vi ska skriva om våran applet så att den använder sig utav detta så blir koden såhär:
  1.  
  2. import java.applet.*;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5.  
  6. public class NewApplet extends Applet implements ActionListener {
  7. private Button button1;
  8. private Button button2;
  9. public void init() {
  10. Label lb = new Label("Hej");
  11. add(lb);
  12. button1 = new Button("Knapp 1");
  13. add(button1);
  14. button2 = new Button("Knapp 2");
  15. add(button2);
  16. button1.addActionListener(this);
  17. button2.addActionListener(this);
  18. }
  19. public void actionPerformed (ActionEvent ae) {
  20. System.out.println("Du tryckte på en knapp!");
  21. }
  22. }


Observera att jag nu tagit bort Button först på rad 13. Detta har jag gjort eftersom vi redan vet att objektet button är av typen Button och vi ska inte berätta detta igen. Jag har också lagt till en knapp till så att vi har två stycken och döpt om dem lite.

Vi ska nu gå igenom en mycket intressant och mycket användbar sak inom Java, nämligen villkorssatsen (eng. if-statement). Denna tillåter oss att köra olika rader kod beroende på vad olika variabler och objekt innehåller t ex. I vårat fall så ska vi kolla vilken knapp det är som har blivit nertryckt. Koden för våran actionPerformed-metod blir då såhär:
  1.  
  2.  
  3. public void actionPerformed(ActionEvent ae) {
  4. if (ae.getSource() == button1) {
  5. System.out.println("Du tryckte på knapp 1!");
  6. }
  7. else if (ae.getSource() == button2) {
  8. System.out.println("Du tryckte på knapp 2!");
  9. }
  10. }


Syntaxet för en villkorssats, eller if-sats, ser ut såhär:
If (uttryck jämföresleoperator uttryck) { gör detta }
Uttrycken är förslagsvis två variabler, och jämförelseoperatorn är den som jämför uttrycken. Om det hela är sant, så körs koden som finns mellan { och }.
En enkel variant på detta:
  1.  
  2. int tal = 5;
  3. if (tal == 5)
  4. {
  5. talet var lika med 5
  6. }


Att jämföra om två uttryck är lika gör man alltså med jämförelseoperatorn == (två likamed-tecken i rad). Det finns även andra operatorer som <, >, !=. De betyder i ordning, vänster uttryck är mindre än höger uttryck, vänster uttryck är större än höger uttryck samt vänster uttryck är inte lika med uttryck.

Man vill ofta kolla om en variabel har ett av kanse 3 olika värden, och köra olika kod beroende på vilket värde variabeln hade. Då kan man antingen skriva flera if-satser i rad. Eller göra en lång if-sats. En lång if-sats kan se ut såhär:
  1.  
  2. int tal = 5;
  3. if (tal == 5)
  4. {
  5. talet var lika med 5
  6. }
  7. else if (tal == 6)
  8. {
  9. talet var lika med 6
  10. }
  11. else if (tal > 6)
  12. {
  13. talet var store än 6
  14. }
  15. else
  16. {
  17. talet var varken, 5, 6 eller större än 6. Alltså är det mindre än 4.
  18. }
  19. [/source
  20.  
  21. I vårat program ska vi jämföra returvärdet av ae.getSource() med två olika objekt. Och koden blir alltså:
  22. [source=java]
  23.  
  24. public void actionPerformed(ActionEvent ae) {
  25. if (ae.getSource() == button1) {
  26. System.out.println("Du tryckte på knapp 1!");
  27. }
  28. else if (ae.getSource() == button2) {
  29. System.out.println("Du tryckte på knapp 2!");
  30. }
  31. }


Som du nyss märkte så kan man jämföra returvärdet av en funktion med ett objekt eller en variabel. Här är det också mycket viktigt att du förstår vad vi gör. Därför rekommenderar jag starkt att du lägger in ett par knappar till och gör en större villkorssats så att du verkligen förstår hur man gör.

Det vart visst lite långt det här, men vi har lärt oss mycket nu!

Slut

Navigation:

< Föregående del || Nästa del >

Till toppen

MySQL Error

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'groups ON users.group = groups.groupId WHERE users.id = '0' LIMIT 1' at line 2
Querystring
SELECT groups.doMod FROM users
	INNER JOIN groups ON users.group = groups.groupId
	WHERE users.id = '0'
    LIMIT 1