Tre h�ftiga swingkomponenterna kommer att anv�ndas, n�mligen
JEditorPane, JScrollPane och
JTable.
En viktig roll har swingklassen
HTML som hanterar och tolkar webbdokument.
Du kommer troligen att beh�va importera de h�r klasserna.
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
Det grafiska gr�nssnittet
N�r man ska skriva ett stort program �r det ofta l�mpligt att b�rja med
en prototyp, dvs ett program som ser ut som den f�rdiga
produkten med saknar funktionalitet. I det h�r fallet ska prototypen
visa en JFrame med tre komponenter: I norr finns ett textf�lt,
i centrum en JEditorPane och i �ster en JTable , alla
tomma. Tabellen ska ha femtio rader och tv� kolumner,
s� den f�r knappast plats i f�nstret. L�gg d�rf�r in den i ett rullf�nster
som visar lagom m�nga rader i taget.
JTable table = new JTable(50,2);
JScrollPane links = new JScrollPane(table);
Det �r �nnu viktigare att l�gga in webbl�saren (centrumkomponenten)
i ett rullf�nster eftersom hela webbsidan vanligen inte kommer att f� plats.
K�r programmet och kolla att det g�r att skriva text i alla
tre komponenterna. N�r det g�ller webbsidan och l�nktabellen �r det en
oavsiktlig finess (bug eller feature?) som vi inte vill ha.
I textf�ltet ska anv�ndaren kunna skriva in �nskad webbadress och vid
tryck p� retur/ENTER ska �nskad webbsida visas i v�r JEditorPane.
D�rf�r beh�vs en lyssnare kopplad till textf�ltet.
Webbl�saren
Skriv en klass Webreader som �rver fr�n JEditorPane .
Se till att det inte g�r att skriva i detta f�nster (metoden setEditable ).
Ge klassen en metod t.ex. showPage(webaddr) .
L�s dokumentationen om JEditorPane f�r att se hur man f�r den
att visa en webbsida. Om den valda webbsidan inte g�r att visa, ge ett felmeddelande
i form av en dialogruta. Anv�nd JOptionPane ! Tag reda p� sj�lv
hur man g�r (API:n eller �vningsanteckningar).
Anv�nd nu Webreader i huvudklassen ist�llet f�r JEditorPane .
Se till att text inskriven i f�ltet h�gst upp tolkas som en URL och att
motsvarande webbsida visas i f�nstret n�r man trycker ENTER!
Innan ni g�r vidare, kolla att programmet fungerar s� h�r l�ngt genom
att titta p� n�gra olika webbsidor. Sidan som syns p� bilden ovan g�r hyfsat
bra att titta p�. H�r �r URL:er till n�gra andra CSC-medarbetares webbsidor.
Dessa webbsidor ser OK ut i v�r enkla webbl�sare:
http://www.nada.kth.se/~orjan
http://www.nada.kth.se/~ala
http://www.nada.kth.se/~viggo
http://www.nada.kth.se/~vahid
http://www.nada.kth.se/~johanh
http://www.nada.kth.se/~ann
L�nktabellen – ing�r i grunduppgiften
I den h�r deluppgiften ska texterna som syns i tabellen till h�ger i
bildexemplet ovan tas fram.
L�t webbl�saren vila ett tag och skriv ett nytt program som skriver ut
alla l�nkar fr�n en webbsida. Programmet kan till att b�rja med
best� av bara en main-metod som skriver ut r�tt information i
terminalf�nstret. N�r det fungerar, �ndra s� att informationen
ist�llet ges i en matris. Mer instruktioner nedan!
Hitta i webbsidan
Man skriver ut en webbsida tecken f�r tecken s� h�r.
String webpage="http://www.nada.kth.se/~henrik";
InputStream in=new URL(webpage).openConnection().getInputStream();
InputStreamReader reader= new InputStreamReader(in);
while(reader.ready())
System.out.print((char)reader.read());
try-catch m�ste l�ggas till eftersom uppkopplingen
(andra raden ovan) kan misslyckas.
I st�llet f�r att l�sa instr�mmen och skriva ut den i terminalf�nstret,
skapa ett tomt HTMLDocument (doc ) och l�t ett
HTMLEditorKit l�sa in webbsidan till dokumentet med
doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
new HTMLEditorKit().read(reader,doc,0);
(Utan den f�rsta satsen f�r man ChangedCharSetException
p� alla svenska sidor som ordentligt anger teckenupps�ttningen iso-8859-1.)
En HTML-sida inneh�ller taggar av olika slag och den
tagg som anv�nds vid l�nkar heter A och har ett attribut HREF vars v�rde
�r l�nkens webbadress. Den nionde raden i tabellen i bildexemplet ovan
kan motsvaras av f�ljande i html-dokumentet:
<A HREF = "http://www.nada.kth.se/~gerd">hustru</A>
Iterera nu genom dokumentet fr�n A-tagg
till A-tagg, l�s av attributet HREF och skriv ut dess v�rde. F�r detta
�ndam�l skapas ett Tag.A-iteratorobjekt och ett HREF-attributobjekt.
Skriv ut HREF-attributet inne i slingan. L�s dokumentationen f�r
klassen HTML och dess inre klasser!
N�r det h�r fungerar, skriv ut den text som st�r mellan
A-taggen och dess sluttagg med hj�lp av
it.getStartOffset() och it.getEndOffset() .
L�s i dokumentationen f�r HTMLDocument hur man kan f� ut
en deltext ur dokumentet! Vi g�r igenom ett liknande exempel (med tagg
men inte attribut) p� �vning 6.
L�gg adress och text i en matris
N�r utskrifterna fungerar s� �ndra testprogrammet s� att det ist�llet f�r
en main-metod med utskrift har en metod som returnerar en String-matris
med adresser och texter motsvarande tabellen. Matrisen ska ha tv� kolumner
och begr�nsat antal rader, t.ex. 50 st. Om det finns fler �n 50 l�nkar
struntar man allts� i de sista.
Metoden som skapar matrisen b�r ta webbsidans adress
(en String ) som parameter.
Testa separat i en main-metod innan den nya metoden anv�nds i huvudprogrammet.
Anv�nd matrisen i huvudprogrammet
I huvudprogrammet finns en JTable med 50 x 2 positioner,
men fr�n b�rjan inget inneh�ll. Enklaste s�ttet att �ndra p� inneh�llet i en
JTable �r att byta ut dess modell. Modellen kan skapas
fr�n tv� String -arrayer, d�r den ena �r tabellinneh�llet och
den andra �r tabellens rubriker. H�r �r ett exempel:
table.setModel(new DefaultTableModel(..., header));
Prickarna ska ers�ttas med skapandet av l�nkmatrisen.
Sl� upp dokumentationen av JTable och l�s d�r om ni beh�ver
veta mer!
Redovisning
- Visa att man kan g� till "sn�lla" webbsidor genom att skriva in
adressen i textf�ltet och trycka ENTER.
- En felaktig URL ska ge en ruta med felmeddelande. Ingen uppdatering
av sida eller l�nkar ska d� g�ras. Felmeddelanden i bakgrunden
accepteras inte, inte heller att programmet avslutas.
- Om en webbsida har fler �n 50 l�nkar ska bara de 50 f�rsta visas.
N�got
Exception som ArrayIndexOutOfBounds
eller liknande f�r inte genereras.
- Visa UML-klassdiagram med klassnamn och de metoder ni skrivit sj�lva
(inklusive omdefinierade metoder).
Extrauppgift f�r betygsh�jning - klickbara l�nkar
Webbl�sarprogrammet vi har gjort reagerar inte p� att man klickar p� l�nkarna i webbsidan.
Extrauppgiften �r att g�ra l�nkarna klickbara och se till att den nya webbsidan
visas i f�nstret.
Tv� saker m�ste g�ras i webbl�saren: g�r setEditable(false)
(kanske redan gjort), s� att inte klickningen tolkas som att du vill b�rja
�ndra i texten. L�gg ocks� till till en HyperlinkListener .
Anropet getURL().toString() till en
HyperlinkEvent ger en fullst�ndig webbadress som kan skrivas
in i adressf�ltet.
L�s dokumentationen
om Hyperlink... och ta reda p� vad som beh�vs!
Krav
- Webbl�saren ska reagarera p� klickningar av l�nkarna,
inte bara p� att mark�ren (musen) h�lls �ver l�nken.
- Den klickade l�nken ska visas i adressf�ltet hos webbl�saren
och den valda sidan ska visas som aktuell webbsida. N�gra till�gg
i
Webreader
kan fixa detta. N�r den nya sidan ska visas kan man ha nytta av
att fr�n programmet framkalla en h�ndelse (ActionEvent )
genom att anropa textf�ltets postActionEvent() .
|