{"id":393,"date":"2011-11-03T14:29:17","date_gmt":"2011-11-03T12:29:17","guid":{"rendered":"http:\/\/www.kristiansborg.dk\/bibliotek\/?page_id=393"},"modified":"2011-11-03T14:32:53","modified_gmt":"2011-11-03T12:32:53","slug":"kapitel-5-javahelp","status":"publish","type":"page","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/","title":{"rendered":"Kapitel 5 JavaHelp"},"content":{"rendered":"<p>De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet. Dette hj\u00e6lpesystem er skr\u00e6ddersyet til Java-platformen, og det er s\u00e5ledes platformsuafh\u00e6ngigt. Systemet er bygget over Java Foundation Classes (JFC) og Swing, og kan s\u00e5ledes kun benyttes fra JDK 1.1 og fremefter.<\/p>\n<div style=\"border: 1px solid red; color: red;\"><strong>Du l\u00e6ser en gammel bog<\/strong><\/p>\n<p>Den bog, du l\u00e6ser her, er fra 1998, og mange ting kan have \u00e6ndret sig siden da.<br \/>\nVi h\u00e5ber, at du stadig kan finde relevant information i den.<br \/>\nHvis du vil l\u00e6se aktuelle oplysninger om de avancerede dele af Java, anbefaler vi<br \/>\nbogen <a href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0132354799)\" target=\"_blank\">Core Java &#8211; Advanced Features<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" alt=\"\" \/><\/div>\n<p>JavaHelp kan bruges til at give on-line-hj\u00e6lp i f\u00f8lgende programmer:<\/p>\n<ul>\n<li>Applikationer<\/li>\n<li>JavaBeans<\/li>\n<li>Applets<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Selvom JavaHelp er en temmelig ny teknologi, er der allerede mange softwarehuse, der planl\u00e6gger at udvikle v\u00e6rkt\u00f8jer, der genererer hj\u00e6lp i JavaHelp-format. I dette kapitel vil det imidlertid blive gennemg\u00e5et, hvordan man laver JavaHelp uden brug af andre v\u00e6rkt\u00f8jer.<\/p>\n<p>&nbsp;<\/p>\n<h1>JavaHelp set fra brugerens synspunkt<\/h1>\n<p>&nbsp;<\/p>\n<p>For at f\u00e5 en forst\u00e5else af JavaHelp-systemet og de krav og muligheder, der g\u00f8r sig g\u00e6ldende ved brug af det, vil systemet f\u00f8rst blive gennemg\u00e5et fra brugerens synspunkt.<\/p>\n<p>&nbsp;<\/p>\n<p>Figur 5.1 viser, hvordan sk\u00e6rmbilledet i en typisk JavaHelp-applikation ser ud. Som det ses, er billedet opdelt i tre dele.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0501.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-394\" title=\"0501\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0501.png\" alt=\"\" width=\"727\" height=\"452\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0501.png 727w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0501-300x186.png 300w\" sizes=\"auto, (max-width: 727px) 100vw, 727px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Opbygningen af JavaHelp-vinduet.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Den venstre del af vinduet bruges til at vise en indholdsfortegnelse, mens den h\u00f8jre del af vinduet viser selve hj\u00e6lpeteksten. Derudover er der en v\u00e6rkt\u00f8jslinie, der indeholder genveje til kommandoer som s\u00f8gning og lignende.<\/p>\n<p>&nbsp;<\/p>\n<h1>JavaHelp set fra programm\u00f8rens synspunkt<\/h1>\n<p>&nbsp;<\/p>\n<p>Fra programm\u00f8rens synspunkt er der andre ting end sk\u00e6rmbilledet, som er vigtige. Det drejer sig om, hvilken funktionalitet JavaHelp stiller til r\u00e5dighed.<\/p>\n<p>&nbsp;<\/p>\n<p>JavaHelp-systemet giver programm\u00f8ren f\u00f8lgende muligheder:<\/p>\n<ul>\n<li>Indholdsfortegnelse. Indholdsfortegnelsen er en liste \u2013 med underpunkter \u2013 s\u00e5 det er muligt at markere overskrifter i flere niveauer. Indholdsfortegnelsen vises p\u00e5 sk\u00e6rmbilledet og bliver automatisk synkroniseret med hj\u00e6lpeteksten, s\u00e5 det emne, der vises, altid er markeret i indholdsfortegnelsen.<\/li>\n<li>Stikordsregister. Med JavaHelp er det muligt at kombinere flere forskellige registre til et samlet stikordsregister.<\/li>\n<li>Friteksts\u00f8gning. S\u00f8gningen g\u00f8r det muligt at s\u00f8ge p\u00e5 al tekst i hele hj\u00e6lpesystemet. Hvis en s\u00f8gning giver flere resultater, bliver disse prioriteret efter i hvor h\u00f8j grad, de opfylder s\u00f8gekriterierne.<\/li>\n<li>Komprimering. JavaHelp underst\u00f8tter Javas komprimeringsformat, JAR. Det betyder, at man kan samle alle sine hj\u00e6lpefiler i en JAR-fil. Det er imidlertid ikke et krav, at filerne skal v\u00e6re komprimerede, og man kan derfor med fordel lade dem v\u00e6re ukomprimerede, mens de stadig er under udvikling.<\/li>\n<li>Fleksibel brugergr\u00e6nseflade. Det er muligt at inkludere JavaHelp-applikationer direkte i ens egen applikation. P\u00e5 den m\u00e5de kan man f\u00e5 vist JavaHelp i en komponent i sin egen brugergr\u00e6nseflade.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>Opbygningen af et JavaHelp-system<\/h1>\n<p>&nbsp;<\/p>\n<p>For at JavaHelp-systemet skal fungere, skal der eksistere en m\u00e6ngde meta-data. Meta-data er data, der beskriver de virkelige data i systemet \u2013 hj\u00e6lpeteksterne.<\/p>\n<p>&nbsp;<\/p>\n<p>I JavaHelp best\u00e5r meta-datadelen af to elementer:<\/p>\n<ul>\n<li>En HelpSet-fil<\/li>\n<li>En map-fil.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>HelpSet-filen bruges af applikationen til at opn\u00e5 information om systemet. Det kan for eksempel dreje sig om referencer til map-filen, indholdsfortegnelse og indeks. Nedenst\u00e5ende er et simpelt eksempel p\u00e5 en HelpSet-fil.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;helpset&gt;<\/p>\n<p>&lt;map&gt;<\/p>\n<p>&lt;data&gt;<\/p>\n<p>jar:file:\/d:\/hj\u00e6lp\/info.jar!\/map.map<\/p>\n<p>&lt;\/data&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/map&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;view&gt;<\/p>\n<p>&lt;name&gt;Indholdsfortegnelse&lt;\/name&gt;<\/p>\n<p>&lt;type format=&#8221;javax.javahelp.TOC.format&#8221;&gt;&lt;\/type&gt;<\/p>\n<p>&lt;data&gt;<\/p>\n<p>jar:file:\/d:\/hj\u00e6lp\/info.jar!indhold.xml<\/p>\n<p>&lt;\/data&gt;<\/p>\n<p>&lt;\/view&gt;<\/p>\n<p>&lt;\/helpset&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Som det ses, ligner syntaksen meget den syntaks, der er kendt fra HTML-filer. Det skyldes, at b\u00e5de HTML og JavaHelps filer bygger p\u00e5 XML-standarden.<\/p>\n<p>Den f\u00f8rste del af HelpSet-filen \u2013 map-delen \u2013 angiver, hvor man kan finde map-filen. I dette eksempel kan den findes i en JAR-fil ved navn d:\\hj\u00e6lp\\info.jar. I denne fil ligger en fil ved navn map.map \u2013 det er denne fil, der skal bruges som map-fil i dette hj\u00e6lpesystem.<\/p>\n<p>Den n\u00e6ste del af filen \u2013 view-delen \u2013 angiver indholdsfortegnelsen. Kommandoen &lt;type&gt; angiver, hvilken type indholdsfortegnelse, der bruges. I dette simple eksempel er det den type, der f\u00f8lger med JavaHelp-systemet, men det er muligt at lave sin egen type.<\/p>\n<p>Den anden del af de meta-data, der skal bruges af JavaHelp, er som n\u00e6vnt map-filen. Denne fil indeholder de referencer, der bruges i applikationen, og navnet p\u00e5 den hj\u00e6lpefil, de henviser til. Filen er opbygget som en af Javas property-filer. Det vil sige, at den best\u00e5r af en r\u00e6kke n\u00f8gler tilknyttet en r\u00e6kke v\u00e6rdier efter f\u00f8lgende syntaks:<\/p>\n<p>N\u00f8gle = v\u00e6rdi<\/p>\n<p>En mapfil kan se s\u00e5ledes ud:<\/p>\n<p>help.intro = introduktion\/side1.html<\/p>\n<p>help.tak = introduktion\/taktil.html<\/p>\n<p>tutor.javahelp = l\u00e6rebog\/javahelp\/side1.html<\/p>\n<p>Form\u00e5let med at have denne mapfil er, at programm\u00f8ren i sit program kun beh\u00f8ver at angive n\u00f8glen for at referere til et hj\u00e6lpeemne. N\u00e5r hj\u00e6lpesystemet skrives, er forfatteren fri til at navngive dokumenterne efter behag. Blot skal hvert emne i mapfilen have tilknyttet et dokument.<\/p>\n<p>JavaHelp-systemet best\u00e5r af andet og mere end meta-data. Af hensyn til systemets funktioner til visning af indholdsfortegnelse og stikord, skal der genereres filer, der indeholder disse informationer. Den egentlige hj\u00e6lpetekst skal naturligvis ogs\u00e5 skrives. Det betyder, at selve hj\u00e6lpesystemet kommer til at best\u00e5 af f\u00f8lgende filer:<\/p>\n<ul>\n<li>Hj\u00e6lpeemnerne<\/li>\n<li>Indholdsfortegnelse<\/li>\n<li>Stikordsregister<\/li>\n<li>Indeks til brug ved friteksts\u00f8gning.<\/li>\n<\/ul>\n<p>En tekst, der udg\u00f8r hj\u00e6lpeemnerne, skrives i HTML efter HTML3.2-standarden. Hvis man vil have yderligere funktionalitet, kan man f\u00e5 det ved at inkludere appletter.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Den fil, der indeholder indholdsfortegnelsen, skrives i XML-format. Nedenst\u00e5ende eksempel viser en simpel indholdsfortegnelse:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;toc&gt;<\/p>\n<p>&lt;tocitem id=help.intro&gt;Introduktion<\/p>\n<p>&lt;tocitem id=help.tak&gt;Tak til&#8230;&lt;\/tocitem&gt;<\/p>\n<p>&lt;\/tocitem&gt;<\/p>\n<p>&lt;tocitem id=tutor.index&gt;L\u00e6reb\u00f8ger<\/p>\n<p>&lt;tocitem id=tutor.javahelp&gt;JavaHelp&lt;\/tocitem&gt;<\/p>\n<p>&lt;\/tocitem&gt;<\/p>\n<p>&lt;\/toc&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Som det ses, angives som ID de navne, der blev defineret i map-filen. Derudover ses det af eksemplet, at man kan lave en hierakisk indholdsfortegnelse ved at l\u00e6gge flere &lt;tocitem&gt;-kommandoer inden i hinanden.<\/p>\n<p>&nbsp;<\/p>\n<p>Stikordsregistret skrives p\u00e5 n\u00e6sten sammen m\u00e5de som indholdsfortegnelsen.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;index&gt;<\/p>\n<p>&lt;indexitem&gt;JavaHj\u00e6lp, se &#8216;JavaHelp'&lt;\/indexitem&gt;<\/p>\n<p>&lt;indexitem id=tutor.javahelp&gt;JavaHelp<\/p>\n<p>&lt;indexitem id=tutor.javahelp&gt;Generelt&lt;\/indexitem&gt;<\/p>\n<p>&lt;indexitem id.tutor.javahelp.download&gt;Download af&lt;\/indexitem&gt;<\/p>\n<p>&lt;\/indexitem&gt;<\/p>\n<p>&lt;\/index&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Igen er det muligt at skabe et hierarki ved at l\u00e6gge flere &lt;indexitem&gt;-kommandoer inden i hinanden. Det ses ogs\u00e5, at man kan skrive almindelig tekst i stikordsregistret ved at undlade id-parametret. Dette kan blandt andet \u2013 som i dette eksempel \u2013 bruges til at lave henvisninger til andre stikord.<\/p>\n<p>S\u00f8gedatabasen skal man ikke selv lave. Inkluderet i JavaHelp-pakken fra Sun er et program, der genererer denne.<\/p>\n<h1>Kald af hj\u00e6lpesystemet<\/h1>\n<p>N\u00e5r man har lavet hj\u00e6lpesystemet, er den n\u00e6ste opgave at kalde det. Det kan g\u00f8res ved hj\u00e6lp af nedenst\u00e5ende kode:<\/p>\n<p>import javax.javahelp.*;<\/p>\n<p>import java.net.*;<\/p>\n<p>import java.io.*;<\/p>\n<p>public class Simpel<\/p>\n<p>{<\/p>\n<p>public Simpel()<\/p>\n<p>{<\/p>\n<p>HelpSet hs = null;<\/p>\n<p>try<\/p>\n<p>{<\/p>\n<p>hs = new HelpSet (ClassLoader.getBaseClassLoader(), new URL(&#8220;file:\/h:\/tf\/java\/eksempler\/javahelp\/avanceret\/Avanceret.hs&#8221;));<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>}<\/p>\n<p>catch (MalformedURLException mue)<\/p>\n<p>{<\/p>\n<p>System.err.println (mue.toString());<\/p>\n<p>}<\/p>\n<p>catch (IOException ioe)<\/p>\n<p>{<\/p>\n<p>System.err.println (ioe.toString());<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>JavaHelp jh = hs.createJavaHelp();<\/p>\n<p>&nbsp;<\/p>\n<p>jh.setVisible(true);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>public static final void main(String args[])<\/p>\n<p>{<\/p>\n<p>Simpel me = new Simpel();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Efter denne overordnede gennemgang af hj\u00e6lpesystemet, vil de enkelte dele i det f\u00f8lgende blive gennemg\u00e5et grundigere.<\/p>\n<p>&nbsp;<\/p>\n<h1>Organisering af en hj\u00e6lpefil<\/h1>\n<p>&nbsp;<\/p>\n<p>JavaHelp-systemet et koncentreret om filer. Dette kan v\u00e6re filer i konventionel forstand eller filer p\u00e5 et netv\u00e6rk eller filer, der bliver skrevet dynamisk af en server. Hvert emne i hj\u00e6lpesystemet udg\u00f8res af en HTML-fil. Som n\u00e6vnt tidligere kan disse filer samles i en JAR-fil. Hvis ens hj\u00e6lpesystem er stort, er det en god id\u00e9 at dele det i flere JAR-filer. Her kan man med fordel samle de dokumenter, der har konceptuel sammenh\u00e6ng, i \u00e9n JAR-fil.<\/p>\n<p>&nbsp;<\/p>\n<p>I den forbindelse skal man v\u00e6re opm\u00e6rksom p\u00e5, hvordan man skriver sine links i HTML-dokumenterne. Hvis man bruger absolutte henvisninger, vil de ikke v\u00e6re gyldige i JAR-filen. Det vil sige, at man skal bruge<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;A HREF = ..\/del2\/side1.html&gt;N\u00e6ste emne&lt;\/A&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>i stedet for<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;A HREF = c:\/hj\u00e6lp\/del2\/side1.html&gt;N\u00e6ste emne&lt;\/A&gt;.<\/p>\n<p>Ogs\u00e5 meta-datafilerne kan l\u00e6gges i JAR-filer. I strukturen b\u00f8r disse ligge i roden af JAR-filen. Hvis en meta-datafil er opdelt i flere filer \u2013 eksempelvis s\u00f8gedatabasen \u2013 kan disse dog l\u00e6gges i underbiblioteker til JAR-filens rodbibliotek.<\/p>\n<p>Ligeledes b\u00f8r selve HelpSet-filen og mapfilen ogs\u00e5 l\u00e6gges i roden af biblioteksstrukturen i JAR-filen.<\/p>\n<p>Selvom det umiddelbart synes bedst altid at l\u00e6gge hele sit hj\u00e6lpesystem i \u00e9n samlet JAR-fil, er der ogs\u00e5 ulemper ved det. Hvis man for eksempel gerne vil installere hj\u00e6lpesystemet uafh\u00e6ngigt at selve applikationen, kan man f\u00e5 behov for at opdatere HelpSet-filen, s\u00e5 dens angivelser af lokationer er korrekte. Dette kan man ikke \u2013 i hvert fald ikke uden videre \u2013 hvis HelpSet-filen er<\/p>\n<p>&nbsp;<\/p>\n<p>inkluderet i JAR-pakken. Derudover mister man ogs\u00e5 muligheden for at opdatere HelpSet-filen, hvis man for eksempel vil tilf\u00f8je yderligere informationer i form af JAR-filer med flere emnefiler.<\/p>\n<p>&nbsp;<\/p>\n<h2>JAR-filer<\/h2>\n<p>&nbsp;<\/p>\n<p>Hvis man v\u00e6lger at bruge JAR-filer i sit system, skal man bruge programmet jar til at lave dem. Dette program kommer med JDK og findes i installationens bin\\-bibliotek. JAR-kommandoen har f\u00f8lgende syntaks, der minder meget om syntaks for Unix-programmet tar:<\/p>\n<p>&nbsp;<\/p>\n<p>jar \u2013kommandoer [-parametre] [jar-fil] [manifest-fil] filer<\/p>\n<p>&nbsp;<\/p>\n<p>jar-programmet accepterer f\u00f8lgende kommandoer:<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"326\" valign=\"top\">C<\/td>\n<td width=\"326\" valign=\"top\">Opret en ny JAR-fil.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">t<\/td>\n<td width=\"326\" valign=\"top\">Vis indholdet af en JAR-fil.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">x<\/td>\n<td width=\"326\" valign=\"top\">Dekomprim\u00e9r en eller flere filer fra JAR-pakken. Hvis   ingen filnavne angives, dekomprimeres alle filer.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Derudover kan man angive nedenst\u00e5ende parametre:<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"326\" valign=\"top\">v<\/td>\n<td width=\"326\" valign=\"top\">Vis yderligere udskrifter.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">f<\/td>\n<td width=\"326\" valign=\"top\">Angiver navnet p\u00e5 JAR-filen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">m<\/td>\n<td width=\"326\" valign=\"top\">Inklud\u00e9r manifest-information.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">0<\/td>\n<td width=\"326\" valign=\"top\">Undlad at komprimere. Dette parameter skal anvendes, hvis   man vil lave JAR-filer, der kan inkluderes i en classpath.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">M<\/td>\n<td width=\"326\" valign=\"top\">Undlad at bruge manifest-fil.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Hvis man eksempelvis vil l\u00e6gge alle filerne i et bibliotek i JAR-filen minjar.jar, skriver man<\/p>\n<p>jar cf minjar.jar *.*<\/p>\n<p>&nbsp;<\/p>\n<p>jar: angiver, at det er jar-protokollen, der skal anvendes. Dette svarer til, at man skriver http: for at angive, at det er http-protokollen, der skal anvendes. Dern\u00e6st angives navnet p\u00e5 den JAR-fil, den p\u00e5g\u00e6ldende fil er en del af. Herefter angives et udr\u00e5bstegn (!), der bruges til at separere navnet p\u00e5 JAR-filen fra navnet p\u00e5 den fil, man vil benytte. Navnet, p\u00e5 den fil man vil benytte, angives som det sidste i en URL efter jar-protokollen.<\/p>\n<p>&nbsp;<\/p>\n<p>Vil man eksempelvis have adgang til filen minfil.txt, der er en del af JAR-pakken filer.jar skriver man<\/p>\n<p>&nbsp;<\/p>\n<p>jar:file:\/c:\/filer.jar!minfil.txt<\/p>\n<p>&nbsp;<\/p>\n<p>Navnet p\u00e5 JAR-filen beh\u00f8ver ikke at v\u00e6re et filnavn. Man kan ogs\u00e5 benytte URL\u2019er fra andre protokoller \u2013 typisk vil http blive benyttet.<\/p>\n<p>&nbsp;<br \/>\n<script type=\"text\/javascript\">\/\/ <![CDATA[\nvar uri = 'http:\/\/impdk.tradedoubler.com\/imp?type(js)g(19172330)a(2029446)' + new String (Math.random()).substring (2, 11);\ndocument.write('<sc'+'ript type=\"text\/javascript\" src=\"'+uri+'\" charset=\"\"><\/sc'+'ript>');\n\/\/ ]]><\/script><\/p>\n<h1>HelpSet-filen<\/h1>\n<p>&nbsp;<\/p>\n<p>N\u00e5r ens applikation starter JavaHelp-systemet, er det f\u00f8rste, der sker, at HelpSet-filen bliver indl\u00e6st. Denne fil indeholder den information, der definerer selve hj\u00e6lpesystemet. Hj\u00e6lpesystemet best\u00e5r af<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Map-filer<\/li>\n<li>Indholdsfortegnelse<\/li>\n<li>Stikordsregister<\/li>\n<li>S\u00f8gedatabase<\/li>\n<li>Hj\u00e6lpeteksterne<\/li>\n<li>Information om visning af de forskellige elementer<\/li>\n<li>Hj\u00e6lpesystemets titel<\/li>\n<li>Et start-ID, der angiver hvilket emne, som skal vises, hvis der ikke angives et emne.<\/li>\n<\/ul>\n<p>HelpSet-filer har normalt filtypen .hs.<\/p>\n<p>Formatet af HelpSet-filen er bygget over XML-standarden. HelpSet-syntaksen definerer f\u00f8lgende kommandoer:<\/p>\n<ul>\n<li>&lt;helpset&gt;. HelpSet-filen indledes med denne kommando. Alle nedenst\u00e5ende kommandoer kan skrives inden i &lt;helpset&gt;-kommandoen.<\/li>\n<li>&lt;title&gt; angiver hj\u00e6lpesystemets titel.<\/li>\n<li>&lt;homeID&gt; angiver navnet p\u00e5 det emne, der skal vises, hvis hj\u00e6lpesystemet startes uden angivelse af et emne.<\/li>\n<li>&lt;map&gt; bruges til at angive navnene p\u00e5 hj\u00e6lpesystemets map-filer. &lt;map&gt;-kommandoen kan indeholde f\u00f8lgende kommando:\n<ul>\n<li>&lt;data&gt; angiver en URL til en mapfil.\u00a0 Hvis hj\u00e6lpesystemet best\u00e5r af flere mapfiler, kan disse angives ved at bruge flere &lt;data&gt;-kommandoer.<\/li>\n<\/ul>\n<\/li>\n<li>&lt;view&gt; bruges til at definere de forskellige oversigter i JavaHelp. Kommandoen kan indeholde f\u00f8lgende kommandoer:\n<ul>\n<li>&lt;name&gt; angiver navnet p\u00e5 oversigten.<\/li>\n<li>&lt;label&gt; angiver det navn, der vises p\u00e5 fanen i brugergr\u00e6nsefladen.<\/li>\n<li>&lt;type&gt; angiver stien til den klasse, der skal bruges som navigator.<\/li>\n<li>&lt;engine&gt; angiver stien til den klasse, der skal bruges som s\u00f8gemaskine.<\/li>\n<li>&lt;data&gt; angiver stien til de data, navigatorklassen skal bruge.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Nedenst\u00e5ende eksempel viser, hvordan en HelpSet-fil kan se ud:<\/p>\n<p>&lt;?xml version=&#8217;1.0&#8242; encoding=&#8217;ISO-8859-1&#8242; standalone=&#8217;yes&#8217; ?&gt;<\/p>\n<p>&lt;helpset&gt;<\/p>\n<p>&lt;title&gt;Avanceret Java-programmering&lt;\/title&gt;<\/p>\n<p>&lt;homeID&gt;velkommen&lt;\/homeID&gt;<\/p>\n<p>&lt;map&gt;<\/p>\n<p>&lt;data&gt;oversigt.map&lt;\/data&gt;<\/p>\n<p>&lt;\/map&gt;<\/p>\n<p>&lt;view&gt;<\/p>\n<p>&lt;name&gt;Stikordsregister&lt;\/name&gt;<\/p>\n<p>&lt;label&gt;Stikord&lt;\/label&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;type&gt;javax.javahelp.JHelpIndexNavigator&lt;\/type&gt;<\/p>\n<p>&lt;data&gt;index.xml&lt;\/data&gt;<\/p>\n<p>&lt;\/view&gt;<\/p>\n<p>&lt;view&gt;<\/p>\n<p>&lt;name&gt;Indholdsfortegnelse&lt;\/name&gt;<\/p>\n<p>&lt;label&gt;Indhold&lt;\/label&gt;<\/p>\n<p>&lt;type&gt;javax.javahelp.JHelpTOCNavigator&lt;\/type&gt;<\/p>\n<p>&lt;data&gt;indhold.xml&lt;\/data&gt;<\/p>\n<p>&lt;\/view&gt;<\/p>\n<p>&lt;view&gt;<\/p>\n<p>&lt;name&gt;S\u00f8gning&lt;\/name&gt;<\/p>\n<p>&lt;label&gt;S\u00f8gning&lt;\/label&gt;<\/p>\n<p>&lt;type&gt;javax.javahelp.JHelpSearchNavigator&lt;\/type&gt;<\/p>\n<p>&lt;engine&gt;javax.javahelp.BasicHelpSearch&lt;\/engine&gt;<\/p>\n<p>&lt;data&gt;HelpIndex&lt;\/data&gt;<\/p>\n<p>&lt;\/view&gt;<\/p>\n<p>&lt;\/helpset&gt;<\/p>\n<p>&nbsp;<\/p>\n<h1>Mapfilen<\/h1>\n<p>&nbsp;<\/p>\n<p>Udseendet af mapfilen er beskrevet tidligere i kapitlet. N\u00e5r man skriver sin mapfil, skal man blot v\u00e6re opm\u00e6rksom p\u00e5, at udseendet af filen afh\u00e6nger af, om man vil inkludere mapfilen i den endelige JAR-fil eller ej.<\/p>\n<p>&nbsp;<\/p>\n<p>Hvis filen eksempelvis indeholder en r\u00e6kke relative referencer som nedenst\u00e5ende fil, vil disse blive bibeholdt, n\u00e5r der oprettes en JAR-fil med hj\u00e6lpefilerne og mapfilen.<\/p>\n<p>&nbsp;<\/p>\n<p>welcome=forord\/forord.html<\/p>\n<p>swing=kapitel1\/swingeksempler.html<\/p>\n<p>eks1_1=kapitel1\/eksempel1-1.html<\/p>\n<p>eks1_2=kapitel1\/eksempel1-2.html<\/p>\n<p>.<\/p>\n<p>.<\/p>\n<p>.<\/p>\n<p>&nbsp;<\/p>\n<p>Det vil sige, at de relative henvisninger er gyldige, s\u00e5 l\u00e6nge b\u00e5de mapfilen og hj\u00e6lpeteksterne ligger i en JAR-fil. V\u00e6lger man derimod at l\u00e6gge mapfilen udenfor den JAR-fil, der indeholder hj\u00e6lpeteksterne, skal man i mapfilen angive placeringen af hj\u00e6lpeteksterne efter jar-protokollen. Det vil sige, at mapfilen kommer til at se s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>welcome=jar:file:\/c:\/java.jar!forord\/forord.html<\/p>\n<p>swing=jar:file:\/c:\/java.jar!swingeksempler.html<\/p>\n<p>eks1_1=jar:file:\/c:\/java.jar!eksempel1-1.html<\/p>\n<p>eks1_2=jar:file:\/c:\/java.jar!eksempel1-2.html<\/p>\n<p>.<\/p>\n<p>.<\/p>\n<p>.<\/p>\n<p>&nbsp;<\/p>\n<p>Indholdsfortegnelsen<\/p>\n<p>&nbsp;<\/p>\n<p>Tidligere i kapitlet er et eksempel p\u00e5 en simpel indholdsfortegnelse blevet gennemg\u00e5et. Derfor vil dette afsnit koncentrere sig om en gennemgang af de kommandoer, der kan bruges i indholdsfortegnelsen.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>&lt;toc&gt; indleder selve filen. Kommandoen kan indeholde f\u00f8lgende kommando:<\/li>\n<li>&lt;tocitem&gt; angiver et element i indholdsfortegnelsen. Hvis man angiver flere &lt;tocitem&gt;-kommandoer inden i hinanden, opretter man en hierakisk indholdsfortegnelse med flere niveauer.\n<ul>\n<li>id-parametret angiver hvilken URL, der skal tilknyttes det p\u00e5g\u00e6ldende punkt i indholdsfortegnelsen. ID\u2019et angives med en henvisning til et af punkterne i mapfilen.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>Stikordsregistret<\/h1>\n<p>&nbsp;<\/p>\n<p>Stikordsregistret defineres ogs\u00e5 ved hj\u00e6lp af XML-sproget. Den fil, der definerer stikordsregistret, kan indeholde f\u00f8lgende kommandoer:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>&lt;index&gt; indleder filen. Denne kommando kan indeholde nedenst\u00e5ende kommando.<\/li>\n<li>&lt;indexitem&gt; angiver et element i stikordsregistret. Ved at s\u00e6tte flere &lt;indexitem&gt;-kommandoer inden i hinanden kan man lave et stikordsregister med flere niveauer.\n<ul>\n<li>id-parametret angiver, hvilken hj\u00e6lpetekst der skal tilknyttes elementet. Dette angives som en af n\u00f8glerne fra mapfilen.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>S\u00f8gedatabasen<\/h1>\n<p>&nbsp;<\/p>\n<p>I mods\u00e6tning til de andre filer i JavaHelp-systemet er s\u00f8gedatabasen ikke skrevet i XML. Den er en bin\u00e6r fil, og det er derfor ikke muligt uden videre at skrive den manuelt. Derfor f\u00f8lger der med JavaHelp-pakken et program, der kan generere s\u00f8gedatabaser. Dette program hedder jhindexer og ligger i installationens bin\\-bibliotek.<\/p>\n<p>&nbsp;<\/p>\n<h1>Implementering af JavaHelp<\/h1>\n<p>&nbsp;<\/p>\n<p>Tidligere i kapitlet blev der vist et kort eksempel p\u00e5 en implementering af et JavaHelp-system. I dette afsnit vil implementeringen af JavaHelp blive beskrevet yderligere.<\/p>\n<p>&nbsp;<\/p>\n<p>Eksemplet viser de tre punkter, der indg\u00e5r i at vise JavaHelp.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Opret et objekt af HelpSet-klassen.<\/li>\n<li>Opret p\u00e5 baggrund af HelpSet-objektet et objekt af JavaHelp-klassen.<\/li>\n<li>Vis JavaHelp.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>HelpSet-objektet oprettes som alle andre objekter, og dens constructor tager to parametre. Det f\u00f8rste er en classloader. Man kan f\u00e5 en reference til den<\/p>\n<p>&nbsp;<\/p>\n<p>aktuelle classloader gennem getBaseClassLoader-metoden, der er en statisk metode i ClassLoader-klassen. Det andet parameter er en reference til en URL, der refererer til HelpSet-filen.<\/p>\n<p>&nbsp;<\/p>\n<p>HelpSet-klassen er defineret s\u00e5ledes:<\/p>\n<p>&nbsp;<\/p>\n<p>public class HelpSet extends java.lang.Object<\/p>\n<p>{<\/p>\n<p>public javax.javahelp.HelpSet(java.lang.ClassLoader,java.net.URL);<\/p>\n<p>public void add(javax.javahelp.HelpSet);<\/p>\n<p>public void addHelpSetListener(javax.javahelp.event.HelpSetListener);<\/p>\n<p>public javax.javahelp.JavaHelp createJavaHelp();<\/p>\n<p>public static java.net.URL findHelpSet(java.lang.ClassLoader, java.lang.String);<\/p>\n<p>public static java.net.URL findHelpSet(java.lang.ClassLoader, java.lang.String, java.lang.String, java.util.Locale);<\/p>\n<p>public static java.net.URL findHelpSet(java.lang.ClassLoader, java.lang.String, java.util.Locale);<\/p>\n<p>public java.net.URL getHelpSetURL();<\/p>\n<p>public java.util.Enumeration getHelpSets();<\/p>\n<p>public java.lang.String getHomeID();<\/p>\n<p>public java.lang.ClassLoader getLoader();<\/p>\n<p>public javax.javahelp.Map getMap();<\/p>\n<p>public javax.javahelp.NavigatorInfo getNavigatorInfo()[];<\/p>\n<p>public javax.javahelp.NavigatorInfo getNavigatorInfo(java.lang.String);<\/p>\n<p>public java.lang.String getTitle();<\/p>\n<p>public boolean remove(javax.javahelp.HelpSet);<\/p>\n<p>public void removeHelpSetListener(javax.javahelp.event.HelpSetListener);<\/p>\n<p>public void setHomeID(java.lang.String);<\/p>\n<p>public void setMap(javax.javahelp.Map);<\/p>\n<p>public void setTitle(java.lang.String);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Som det ses af ovenst\u00e5ende signatur, kan man tilf\u00f8je <em>listeners<\/em> til hj\u00e6lpesystemet. Dette g\u00f8res ved at oprette et objekt af klassen javax.javahelp.event.HelpSetListener. Dette er i tr\u00e5d med Javas generelle event-h\u00e5ndtering i eksempelvis AWT og Swing. Der opst\u00e5r blandt andet events, n\u00e5r der indl\u00e6ses et nyt hj\u00e6lpesystem, og n\u00e5r et hj\u00e6lpesystem fjernes.<\/p>\n<p>&nbsp;<\/p>\n<p>Derudover indeholder klassen funktioner, der kan hj\u00e6lpe med at finde et hj\u00e6lpesystem. Dette sker p\u00e5 baggrund af regionale indstillinger gemt i et Locale-objekt. Hvordan Locale-objekter oprettes og bruges bliver beskrevet senere i denne bog.<\/p>\n<p>&nbsp;<\/p>\n<p>Klassen indeholder ogs\u00e5 metoder, der arbejder p\u00e5 HelpSet-filen. Det drejer sig dels om funktioner, der kan hente de oplysninger, der st\u00e5r i filen<\/p>\n<p>&nbsp;<\/p>\n<p>, men ogs\u00e5 metoder, der kan \u00e6ndre de indstillinger, der blev indl\u00e6st fra filen.<\/p>\n<p>&nbsp;<\/p>\n<p>Klassen indeholder ogs\u00e5 en funktion, der p\u00e5 baggrund af det aktuelle hj\u00e6lpesystem kan oprette et JavaHelp-objekt. Det er funktionen createJavaHelp.<\/p>\n<p>&nbsp;<\/p>\n<p>JavaHelp-objektet kan blandt andet bruges til at vise selve hj\u00e6lpesystemet og ogs\u00e5 til at vise enkelte emner. JavaHelp er et interface med f\u00f8lgende signatur:<\/p>\n<p>&nbsp;<\/p>\n<p>public abstract interface JavaHelp extends java.lang.Object {<\/p>\n<p>public abstract java.lang.String getCurrentID();<\/p>\n<p>public abstract java.lang.String getCurrentView();<\/p>\n<p>public abstract javax.javahelp.HelpSet getHelpSet();<\/p>\n<p>public abstract java.net.URL getURL();<\/p>\n<p>public abstract boolean isViewDisplayed();<\/p>\n<p>public abstract boolean isVisible();<\/p>\n<p>public abstract void setCurrentID(java.lang.String);<\/p>\n<p>public abstract void setCurrentView(java.lang.String);<\/p>\n<p>public abstract void setURL(java.net.URL);<\/p>\n<p>public abstract void setViewDisplayed(boolean);<\/p>\n<p>public abstract void setVisible(boolean);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Metoden setVisible bruges til at vise selve JavaHelp-systemet. Derudover kan man ved hj\u00e6lp af setCurrentID-metoden bestemme, hvilket emne der skal vises. P\u00e5 denne m\u00e5de kan man lave kontekstafh\u00e6ngig hj\u00e6lp. Det vil sige, at den hj\u00e6lp, brugeren f\u00e5r, n\u00e5r vedkommende klikker p\u00e5 hj\u00e6lpeknappen, afh\u00e6nger af, hvor i programmet, brugeren befinder sig. Metoden setCurrentID tager et ID som parameter. Det vil sige, at man skal angive en af n\u00f8glerne fra mapfilen. Hvis man hellere vil angive navnet p\u00e5 selve den fil, der skal vises, skal man bruge metoden setURL.<\/p>\n<p>&nbsp;<\/p>\n<p>Som n\u00e6vnt i begyndelsen af kapitlet bygger JavaHelp blandt andet p\u00e5 Swing. Det vil sige, at det er muligt at bruge Swings metoder til at tilpasse udseendet af hj\u00e6lpesystemet til brugerens operativsystem. Det er klassen JHelp, der h\u00e5ndterer udseendet af hj\u00e6lpesystemet. JHelp har f\u00f8lgende signatur:<\/p>\n<p>&nbsp;<\/p>\n<p>public class JHelp extends java.awt.swing.JComponent implements javax.javahelp.event.HelpSetListener<\/p>\n<p>{<\/p>\n<p>public javax.javahelp.JHelp();<\/p>\n<p>public javax.javahelp.JHelp(javax.javahelp.HelpSet);<\/p>\n<p>public javax.javahelp.JHelp(javax.javahelp.HelpSet,javax.javahelp.JHelpViewer,boolean);<\/p>\n<p>public javax.javahelp.JHelp(javax.javahelp.HelpSet,boolean);<\/p>\n<p>&nbsp;<\/p>\n<p>public void addHelpNavigator(javax.javahelp.JHelpNavigator);<\/p>\n<p>public javax.javahelp.JHelpViewer getContentViewer();<\/p>\n<p>public javax.javahelp.JHelpNavigator getCurrentNavigator();<\/p>\n<p>&nbsp;<\/p>\n<p>public java.util.Enumeration getHelpNavigators();<\/p>\n<p>public java.net.URL getHelpSetURL();<\/p>\n<p>public javax.javahelp.HelpHistory getHistory();<\/p>\n<p>public javax.javahelp.HelpModel getModel();<\/p>\n<p>public javax.javahelp.plaf.HelpUI getUI();<\/p>\n<p>public java.lang.String getUIClassID();<\/p>\n<p>public void helpSetAdded(javax.javahelp.event.HelpSetEvent);<\/p>\n<p>public void helpSetRemoved(javax.javahelp.event.HelpSetEvent);<\/p>\n<p>public boolean isNavigatorDisplayed();<\/p>\n<p>public void setCurrentNavigator(javax.javahelp.JHelpNavigator);<\/p>\n<p>public void setHelpSetSpec(java.lang.String);<\/p>\n<p>public void setHistory(javax.javahelp.HelpHistory);<\/p>\n<p>public void setModel(javax.javahelp.HelpModel);<\/p>\n<p>public void setNavigatorDisplayed(boolean);<\/p>\n<p>public void setUI(javax.javahelp.plaf.HelpUI);<\/p>\n<p>public void updateUI();<\/p>\n<p>public void visitID(java.lang.String);<\/p>\n<p>public void visitURL(java.net.URL);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Klassen indeholder b\u00e5de funktioner, der kan bruges til at se, hvilket udseende brugergr\u00e6nsefladen har, og metoder, der \u00e6ndrer den. Det drejer sig om henholdsvis metoderne getIU og setUI. Selvom disse som n\u00e6vnt afspejler Swings funktionalitet, benytter de ikke Swings klasser, men i stedet en klasse, der er specielt skrevet til JavaHelp-systemet. Det drejer sig om klassen javax.javahelp.plaf.HelpUI, der nedarver fra java.awt.swing.plaf.ComponentUI.<\/p>\n<p>JHelp-klassen giver ogs\u00e5 mulighed for event-h\u00e5ndtering, ligesom det er muligt at \u00e6ndre de komponenter, der vises i JavaHelps brugergr\u00e6nseflade.<\/p>\n<h1>Sammenfatning<\/h1>\n<p>I dette kapitel er det blevet beskrevet, hvordan man kan bruge JavaHelp til at skrive on-line-hj\u00e6lp til sin Java-applikation. Fordelene ved dette er blandt andet platformsuafh\u00e6ngighed og let integration med Java-programmet. Hj\u00e6lpeteksterne kan skrives i HTML, mens de filer, der indeholder information om selve hj\u00e6lpesystemet \u2013 indholdsfortegnelse, stikordsregister og lignende \u2013 skal skrives i XML.<\/p>\n<p>For at tilg\u00e5 hj\u00e6lpesystemet fra en Java-applikation skal man bruge de klasser, der ligger i pakken javax.javahelp.<\/p>\n<h1>FAQ<\/h1>\n<h3>Kan JavaHelp blive brugt af programmer, der ikke er skrevet i Java?<\/h3>\n<p>Ja. Ved at skrive en HelpServer kan man bruge JavaHelp-systemet fra eksempelvis C++. Det g\u00f8r, at man kan bruge det samme hj\u00e6lpesystem i alle sine programmer, selvom de skrives i forskellige programmeringssprog.<\/p>\n<h3>Kan man bruge JavaScript i hj\u00e6lpeteksterne?<\/h3>\n<p>&nbsp;<\/p>\n<p>P\u00e5 nuv\u00e6rende tidspunkt er kun Java-appletter underst\u00f8ttet af JavaHelps HTML-fremviser. Sun udelukker dog ikke, at det p\u00e5 et senere tidspunkt vil v\u00e6re muligt at erstatte HTML-fremviseren med en mere avanceret udgave.<\/p>\n<div style=\"border: 1px solid red; color: red;\"><strong>Du l\u00e6ser en gammel bog<\/strong><\/p>\n<p>Den bog, du l\u00e6ser her, er fra 1998, og mange ting kan have \u00e6ndret sig siden da.<br \/>\nVi h\u00e5ber, at du stadig kan finde relevant information i den.<br \/>\nHvis du vil l\u00e6se aktuelle oplysninger om de avancerede dele af Java, anbefaler vi<br \/>\nbogen <a href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0132354799)\" target=\"_blank\">Core Java &#8211; Advanced Features<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" alt=\"\" \/><\/div>\n","protected":false},"excerpt":{"rendered":"<p>De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet. Dette hj\u00e6lpesystem er skr\u00e6ddersyet til Java-platformen, og det er s\u00e5ledes platformsuafh\u00e6ngigt. Systemet er bygget over Java Foundation Classes (JFC) og Swing, og kan s\u00e5ledes kun benyttes fra JDK 1.1 og [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":332,"menu_order":50,"comment_status":"closed","ping_status":"open","template":"","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"class_list":["post-393","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"keywords\" content=\"java,hj\u00e6lp,online,javahelp,jfc,swing\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Biblioteket | Samling af artikler og b\u00f8ger\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"JavaHelp | Biblioteket\" \/>\n\t\t<meta property=\"og:description\" content=\"De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2011-11-03T12:29:17+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2011-11-03T12:32:53+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"JavaHelp | Biblioteket\" \/>\n\t\t<meta name=\"twitter:description\" content=\"De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-5-javahelp\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"position\":2,\"name\":\"B\\u00f8ger\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/#listItem\",\"name\":\"Avanceret Java-programmering\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/#listItem\",\"position\":3,\"name\":\"Avanceret Java-programmering\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-5-javahelp\\\/#listItem\",\"name\":\"Kapitel 5 JavaHelp\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-5-javahelp\\\/#listItem\",\"position\":4,\"name\":\"Kapitel 5 JavaHelp\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/#listItem\",\"name\":\"Avanceret Java-programmering\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-5-javahelp\\\/#webpage\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-5-javahelp\\\/\",\"name\":\"JavaHelp | Biblioteket\",\"description\":\"De fleste interaktive programmer har brug for en eller anden form for on-line-hj\\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\\u00e5l er JavaHelp-systemet blevet udviklet.\",\"inLanguage\":\"da-DK\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-5-javahelp\\\/#breadcrumblist\"},\"datePublished\":\"2011-11-03T14:29:17+02:00\",\"dateModified\":\"2011-11-03T14:32:53+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"inLanguage\":\"da-DK\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"JavaHelp | Biblioteket","description":"De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet.","canonical_url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/","robots":"max-image-preview:large","keywords":"java,hj\u00e6lp,online,javahelp,jfc,swing","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","position":1,"name":"Home","item":"https:\/\/www.kristiansborg.dk\/bibliotek","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","position":2,"name":"B\u00f8ger","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/#listItem","name":"Avanceret Java-programmering"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/#listItem","position":3,"name":"Avanceret Java-programmering","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/#listItem","name":"Kapitel 5 JavaHelp"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/#listItem","position":4,"name":"Kapitel 5 JavaHelp","previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/#listItem","name":"Avanceret Java-programmering"}}]},{"@type":"Organization","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/"},{"@type":"WebPage","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/#webpage","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/","name":"JavaHelp | Biblioteket","description":"De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet.","inLanguage":"da-DK","isPartOf":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website"},"breadcrumb":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/#breadcrumblist"},"datePublished":"2011-11-03T14:29:17+02:00","dateModified":"2011-11-03T14:32:53+02:00"},{"@type":"WebSite","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","inLanguage":"da-DK","publisher":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization"}}]},"og:locale":"da_DK","og:site_name":"Biblioteket | Samling af artikler og b\u00f8ger","og:type":"article","og:title":"JavaHelp | Biblioteket","og:description":"De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet.","og:url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/","article:published_time":"2011-11-03T12:29:17+00:00","article:modified_time":"2011-11-03T12:32:53+00:00","twitter:card":"summary","twitter:title":"JavaHelp | Biblioteket","twitter:description":"De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet."},"aioseo_meta_data":{"post_id":"393","title":"JavaHelp | #site_title","description":"De fleste interaktive programmer har brug for en eller anden form for on-line-hj\u00e6lp. Java-programmer er naturligvis ingen undtagelse. Til dette form\u00e5l er JavaHelp-systemet blevet udviklet.","keywords":[{"label":"Java","value":"Java"},{"label":"Hj\u00e6lp","value":"Hj\u00e6lp"},{"label":"online","value":"online"},{"label":"JavaHelp","value":"JavaHelp"},{"label":"JFC","value":"JFC"},{"label":"Swing","value":"Swing"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2020-12-21 06:59:15","updated":"2025-06-04 02:17:13","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/\" title=\"B\u00f8ger\">B\u00f8ger<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/\" title=\"Avanceret Java-programmering\">Avanceret Java-programmering<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tKapitel 5 JavaHelp\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.kristiansborg.dk\/bibliotek"},{"label":"B\u00f8ger","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/"},{"label":"Avanceret Java-programmering","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/"},{"label":"Kapitel 5 JavaHelp","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-5-javahelp\/"}],"_links":{"self":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/comments?post=393"}],"version-history":[{"count":4,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/393\/revisions"}],"predecessor-version":[{"id":396,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/393\/revisions\/396"}],"up":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/332"}],"wp:attachment":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/media?parent=393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}