dit06omr@cs.umu.se 1 december 2008 Laboration 2 RSS Läsare Kurs: Applikationsprogrammering i Java, HT-08 HT08 5DV085 Kursansvarig: Övriga lärare & handledare: Johan Eliasson Johan Granberg Tor Sterner-Johansson Daniel Henriksson P-O Östberg
dit06omr@cs.umu.se 1 december 2008 Innehållsförteckning Problemspecifikation...1 Åtkomst och användarhandledning...1 Systembeskrivning...1 Lösningens begränsningar...2 Problem och reflektioner...2 Testkörningar...1 Bilagor...1 Källkod...1 Kurs: Applikationsprogrammering i Java, HT-08 HT08 5DV085 Kursansvarig: Övriga lärare & handledare: Johan Eliasson Johan Granberg Tor Sterner-Johansson Daniel Henriksson P-O Östberg
Problemspecifikation Laborationen går ut på att skapa en dynamisk RSS-läsare med ett valfritt grafiskt gränssnitt. Krav som ställs är bland annat att skapa denna med hjälp av god objektorienterad metodik, följa Suns javakonvention och att designa gränssnittet enligt MDI teori. RSS-läsaren ska kunna spara inställningar mellan körningar, uppdateras automatiskt och man ska kunna lägga till nya feeds. Orginalspecifikation: http://www.cs.umu.se/kurser/5dv085/ht08/labbar/lab2.html Åtkomst och användarhandledning Källkod: Kompilerad pc version: Kompilering: Exekvering (cmd): ~dit06omr/edu/apjava/lab2/src/ ~dit06omr/edu/apjava/lab2/bin/ ~dit06omr/edu/apjava/lab2/src/javac *.java ~dit06omr/edu/apjava/lab2/java -cp bin;bin/jdom.jar JeedReader 1
Systembeskrivning Programmet sparar undan alla nyheter som läses från angiven rss-kanal, den håller på så sätt reda på vilka nyheter som är lästa och olästa plus att man kan läsa gamla nyheter vid ett senare tillfälle. Kanalerna listas i ett träd till vänster i programmet. Nyheterna ligger på rad till höger ordnat efter senaste nyheten. För att markera en nyhet läst klickar man endast på nyheten så minimeras denna. NewsItem content: String link: URL read: Boolean title: String NewsItemGui NewsItem(in title: String, in content: String, in link: URL) getdescription(): String desc: String getlink(): URL jeedgui: JeedGui ml: MouseListener nyheten: NewsItem title: String NewsItemGui(in outputstring: String, in nyheten: NewsItem, in title: String, in desc: String, in jeedgui: JeedGui) getdesc(): String gettitle(): String gettitle(): String isread(): Boolean setread() setunread() doc: Document filename: String hasdesc: boolean hastitle: boolean intervall: Integer JeedFeeder jeedreader: JeedReader name: String onlinenyheter: NewsItem run: boolean url: URL xmlnyheter: NewsItem FeedGui feed: JeedFeeder jeedgui: JeedGui nyheter: NewsItemGui FeedGui(in feed: JeedFeeder, in jeedgui: JeedGui) getname(): String updatefeed() JeedFeeder(in name: String, in filename: String, in url: String, in jeedreader: JeedReader) getfilename(): String getintervall(): Integer getname(): String getnews(): LinkedList geturl(): URL loadonlinefeed() loadxmlfeed() run() savefeed() setintervall(in intervall: int) setname(in name: String) seturl(in url: URL) stop() «access» JeedGui addfeed: ActionListener cards: JPanel cl: CardLayout feedlist: JeedFeeder fgui: FeedGui ml: MouseListener reader: JeedReader selrow: int setintervall: ActionListener top: DefaultMutableTreeNode treefeeds: JTree updateall: ActionListener updateselected: ActionListener JeedGui addlastnode(in namn: String, in f: JeedFeeder) createnodes(in top: DefaultMutableTreeNode) getfeedguis(): ArrayList makemenu() maketree(): JScrollPane updatefeed() JeedReader feeds: JeedFeeder gui: JeedGui JeedReader() addfeed(in namn: String, in url: String) avoidduplicatefile(in namn: String): File loadxmlfeeds() loadxmlfile(in srcfile: String): Document loadxmlurl(in url: URL): Document main(in args: String[]) savefeeds() updatefeeds() updategui() JeedReader Huvudklassen för programmet. Läser in sparade feeds och inställningar. Instansierar gränssnittet. JeedFeeder Varje RSS-feed är en instans av denna. Klassen använder sig av en egen tråd för att uppdatera rss-feedsen kontinuerligt. Klassen ärver av Runnable. NewsItem En nyhetsartikel. 1
JeedGui Huvudklassen för gränssnittet. Ärver av JFrame. Varje FeedGui läggs till i en CardLayout för att kunna byta mellan dessa. FeedGui Varje RSS-feed har en instans av denna för sitt GUI. Ärver av JPanel. NewsItemGui Varje nyhets grafiska gränssnitt är av denna typ. Ärver av JEditorPane. Lösningens begränsningar På Mac java version 1.5 visar JEditorPane inte htmlkoden korrekt men på pc visas det korrekt. Programmet måste avslutas genom att man trycker på krysset både på PC och Mac. Man kan alltså inte använda sig av äpple+q för att avsluta programmet på Mac, då sparas inte vilka nyheter som är lästa samt tillagda feeds och inställningar. Man kan inte ta bort tillagda feeds i programmet. Programmet sparar undan alla nyheter den har fått in, det finns ingen begränsning på maxantal. Programmet kommer alltså krascha när det blir för många nyheter och man måste då manuellt ta bort de sparade feedsen. Om jag hade haft tid hade jag implementerat en funktion som skrev över de äldsta nyheterna när man uppnådde ett visst antal nyheter i varje feed. Problem och reflektioner Största problemet med labben var att skapa gränssnittet. Jag valde ett ganska svårt gränssnitt att implementera. Problem låg i att hitta vilken Layout Manager som bäst kunde sköta nyheterna så de hamnade under varandra och som hade en dynamisk höjd men fast bredd. Problem låg även i att få en rullist på panelen som håller nyheterna även att denna skulle anpassa sin höjd (eller skrollbarhet ) till innehållet. Laborationen kändes väldigt stor. Jag har suttit cirka 8 timmar per dag 5 dagar i veckan för att få till den. 2
Testkörningar Innan klick: Efter klick: Bilagor Källkod 1