| 
 Laboration 5 - LivsträdetBoken Object-oriented programming in Java av Martin Kalin har 
tidigare använts som kursbok på DD2385. I boken finns ett program som 
grafiskt presenterar filkatalogträd med hjälp av en avancerad swingkomponent,
JTree. 
Uppgiften i denna labb är att grafiskt presentera en annan trädstruktur.
JTree ska användas men också den inramning till JTree
som Kalins program har. 
Kalins kod har modifierats en del och delats upp på två klasser.
Först har vi TreeFramesom definierar trädet och dess inramning:
EnTreeFrameär enJFramesamt innehåller
en knapp, en liten klickruta och det klickbara trädet.TreeFrameär ett körbart program men
det träd som skapas hara bara ett rotobjekt, inga grenar. 
Den andra klassen, DirTree2, ärverTreeFrameoch definierar om de metoder iTreeFramesom skapar 
själva trädstrukturen så att det är ett filkatalogträd som visas. Några
nya hjälpmetoder och någon variabel definieras också iDirTree2. 
TreeFrame.java.
   
DirTree2.java
 
Spara båda dessa klasser och kompilera och provkör dem. Båda har main-metod.
Se till att ni förstår hur de är konstruerade, åtminstone i stora drag.
 
 java TreeFramevisar ett träd med bara en rot.
 
 
java DirTree2
visar trädet för den filkatalog du står i. Försök med någon annan
katalog, t.ex.
 
 
java DirTree2 ~
visar trädet för din hemkatalog under Linux/Unix (kan ta tid om den är stor)
 
 
java DirTree2 ../../recept
visar katalogen recept som förutsätts ligga två nivåer uppåt i 
katalogträdet. 
Kolla att klickningar i trädet fungerar och att man kan få
veta detaljer om en fil om Show detailsär markerad. Ny subklass till TreeFrameLabbuppgiftens program ska ha en struktur som liknarDirTree2,
dvs det ska ärva frånTreeFrameoch definiera om de metoder
som behövs för att beskriva ett nytt träd. Tänk på att det går utmärkt att
skriva fler metoder i subklassen, titta på strukturen påDirTree2men gå inte in för djupt på detaljerna om filkatalogerna!Ett minimalt livsträdI denna förberedande uppgift ska ett litet enkelt träd visas,
nämligen ett livsträd med tre barn som alla är löv.
I trädets rot ska det ståLivoch de tre barnen ska varaVäxter,DjurochSvampar. 
Dessa ska senare i sin tur
kunna innehålla ordningar, underordningar, familjer, släkten och arter.
Gör en ny subklass tillTreeFrame. DefinierainitTree()att göra följande:
 Skapa en rotnod med ordet "Liv".
 Skapa en trädmodell.
 Tillverka en nod childpå samma sätt som rotnoden men
     med texten "Växter". Addera den till trädmodellen med rootsom förälder,root.add(child);Titta eventuellt i
 DirTree2för att se hur man gör. Gör likadant med "Djur" och "Svampar".
 Kompilera, kör och kolla att det ser bra ut.
 Ett rekursivt livsträdI stället för att tillverka noderna "för hand" ska du läsa in livsträdet
från filen
Liv.xml 
(finns även som 
Liv.txt) och rekursivt bygga upp ett träd. 
En liten testversion av filen ser ut som visas här nedanför. Filen finns 
också i LillaLiv.txt. 
Om du har problem med svenska bokstäverna, använd följande versioner
som är utan åäö:
Life.txt,
Life.xml och 
TinyLife.txt
 
 
<Biosfär namn="Liv"> är allt som fortplantar sej 
<Rike namn="Växter"> kan inte förflytta sej 
</Rike> 
<Rike namn="Djur"> kan förflytta sej 
</Rike>
<Rike namn="Svampar"> är varken djur eller växter 
</Rike>
</Biosfär>
Förutom nodens namn finns i filerna också en nivå (t.ex. Biosfär, Rike) och
en förklarande text men för dom finns ingen plats i klassen DefaultMutableTreeNode. 
Skriv därför en egen subklass t.ex.MyNodemed 
String-variablernalevelochtextså att alla
data från livträdsfilerna får plats. 
Skriv sedan en rekursiv metod som läser filen och skapar trädet, t.ex.
enligt följande:
  root = buildTree(); //Läser XML-filen och skapar hela trädet 
  Metoden returnerar ett objekt av typ MyNodesom blir
trädets rot. Metoden anropas rekursivt för varje nod i trädet
och lägger noden som barn till sin förälder.
När anropet ovan är klart har hela trädstrukturen skapats. 
 
Man kan ha nytta av att ha en global variabel String rad;
som är en buffert mellan programmet och filen. 
Allra först läses filens första rad till variabelnrad.
När allt i den har behandlats läses nästa filrad tillrado.s.v. Genom attradär global kommer man åt den från 
alla anropsnivåer avbuildTree(). 
Liksom i DirTree2 ska man kunna ange filnamn i exekveringskommandot 
 
 
java LifeTree livfil
 och om inget namn anges ska programmet ta filen
 Liv.xml.
 
 Detaljupplysningar om livetI det ursprungliga programmet får man filupplysningar om "Show details"
förkryssas. I ditt program ska man i stället få se den förklarande
texten, till exempel
Art: Mås gillar Vaxholmsbåtar. 
Fixa så att  showDetails(TreePath p)lägger ut denna text
i sin JOptionPane.
 
 Läsning från textfilGörs enklast med klassenScanner:    Scanner sc = new Scanner(new File("infil.txt"));new File(...)kan generera ettFileNotFoundExceptionsom måste hanteras men om det gick bra att hitta filen kan man sedan
läsa radvis medsc.nextLine().Krav på programmet 
 Indatafil med godtycklig storlek ska klaras av. 
Programmet får inte förutsätta att 
att någon nod har ett fast antal barn
eller att trädet har ett visst djup.
Rekursion ska användas när filen läses men det är inte
nödvändigt att följa anvisningarna ovan med buildTree(). Programmet ska kontrollera att starttagg och sluttagg stämmer
överens men behöver inte identifiera andra typer av fel i indatafilen.
 Filformat m.m.
Självklart är det tillåtet och 
snyggt att klara av indata som inte är så väl formaterade, t.ex. har flera
blanktecken mellan orden, blanktecken före och efter tecknen "=", "<"
och ">" samt extra radbyten eller utelämnade radbyten. Det är naturligtvis
också utmärkt att identifiera andra syntaxfel än felaktig sluttagg men det 
krävs inte!Programmet får förutsätta att indatafilen är formaterad
så som exemplen, alltså att filen är radindelad med en 
"tagg" per rad som exempelfilerna och att det är exakt ett blanktecken 
mellan nivån och ordet namn
 <Biosfär namn="Liv">är  allt  som  fortplantar  sejsamt inga blanktecken alls på andra ställen utom i den förklarande
texten i slutet av raderna.
Det är tillåtet att läsa filen radvis, dvs att låta programmet hämta in
en hel rad från filen och därefter bearbeta hela den raden, läsa in ny 
rad o.s.v. Alternativet är att läsa ett tecken i taget vilket gör 
uppgiften svårare.
 RedovisningKör programmet med den större infilen och demonstrera alla funktioner. Glöm inte
att be om handledarens signatur på kvittensbladet när han/hon är nöjd med
er redovisning!  
 Extrauppgift för högre betyg (liten!)Ordna så att man förutom grundinformationenArt: Mås gillar Vaxholmsbåtarockså får hela kedjan av namn utskriven
på formenmen allt som är Mås är Fåglar är Djur är Liv.
Användbar metod iTreePathärgetLastPathComponent(). IDefaultMutableTreeNodeoch därmed iMyNodefinns metodengetParent().
Det finns även andra metoder som löser uppgiften. |