![]() |
![]() |
Start på kapittel om spesialiserte komponenter for grafiske brukergrensesnitt |
JEditorPane
En ganske vanlig funksjonalitet for vindusprogrammer er at brukeren kan få
opp hjelp på skjermen i form av html-filer som vises. Tekstkomponenter av type
JEditorPane
kan brukes til å vise slike html-filer. I prinsippet
kan man i en JEditorPane
vise html-filer fra en hvilken som helst
adresse på internett, slik at den kan brukes på liknende måte som en nettleser.
En JEditorPane
har imidlertid enkelte begrensninger. Det er for
eksempel ikke mulig å vise appleter i en JEditorPane
.
For øvrig er det i en JEditorPane
mulig å vise RTF-tekst, det vil
si tekstfiler som har rtf-format (rikt tekst-format). Vi kan selvsagt også
vise 'vanlig' tekst i en JEditorPane
. Men dersom vi ikke har behov for å vise noe annet
enn det, bør vi heller bruke et vanlig tekstområde.
Når en JEditorPane
blir opprettet, vil den i utgangspunktet være
editerbar. I denne modusen vil eventuelle hyperlenker ikke være
aktive når de vises. Det anbefales derfor at den gjøres ikke-editerbar ved
setEditable(false)
(tilsvarende som vi kan gjøre med
tekstfelter og tekstområder).
For å vise html-filer i en JEditorPane
brukes metoden
setPage(kilde);
der kilde
kan være en nettadresse eller et
URL
-objekt. Metoden vil kaste ut en IOException
i
tilfelle parameteren er null
eller angir en ugyldig URL-spesifikasjon.
Siden dette er en sjekket Exception
, må vi enten fange den opp
eller spesifisere at den kan bli kastet ut. For øvrig kan vi,
siden en JEditorPane
er en tektstkomponent
(den er subklasse til JTextComponent
), også bruke metoden
setText
. Men denne metoden vil bare skrive ut vanlig
tekst.
setPage
må altså være et
URL
-objekt
eller en nettadresse. Dersom vi ønsker å vise en
html-fil som ligger i samme filkatalog som
class
-filene til programmet, betyr
det at vi på grunnlag av denne må opprette et URL
-objekt. Dersom
programkoden som skal utføres ligger i klassen URLframviser
og
fila som vi ønsker å vise heter info.html, kan vi gjøre dette slik:
URL kilde = URLframviser.class.getResource("info.html");Klassen
URL
må vi importere fra pakken java.net
.
For at eventuelle hyperlenker skal virke, må vi som nevnt gjøre vår
JEditorPane
ikke-editerbar. Dessuten er det nødvendig å
implementere og registrere en
HyperLinkListener
for den. Hvordan dette kan gjøres er vist i følgende eksempel.
I programmet
EditorPaneTest
kan nettadresser skrives inn i et tekstfelt.
Det er en knapp for å vise i en JEditorPane
den kilde som det er
skrevet adresse for. Besøkte nettadresser blir lagt inn i en stakk slik at
en ved å klikke på den andre knappen kan gå tilbake til tidligere besøkte
adresser, tilsvarende som i en nettleser. Det er definert en
HyperLinkListener
slik at klikk på hyperlenker virker som det skal.
Java-koden for programmet er gjengitt nedenfor.
1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.*; 4 import java.util.*; 5 import javax.swing.*; 6 import javax.swing.event.*; 7 import java.net.URL; 8 9 class URLframviser2 extends JFrame 10 { 11 private JTextField urlfelt; 12 private JButton lastNed, tilbake; 13 private JEditorPane lerret; 14 private LinkedList<String> urlStakk = new LinkedList<>(); 15 private Knappelytter lytter = new Knappelytter(); 16 private Hyperlinklytter linklytter = new Hyperlinklytter(); 17 18 public URLframviser2() 19 { 20 setTitle("EditorPaneTest"); 21 setSize(800, 700); 22 23 urlfelt = new JTextField(50); 24 25 lastNed = new JButton("Last ned"); 26 lastNed.addActionListener(lytter); 27 tilbake = new JButton("Tilbake"); 28 tilbake.addActionListener(lytter); 29 30 lerret = new JEditorPane(); 31 lerret.setEditable(false); 32 lerret.addHyperlinkListener(linklytter); 33 34 Container contentPane = getContentPane(); 35 contentPane.add(new JScrollPane(lerret), BorderLayout.CENTER); 36 37 // samler kontrollkomponentene i et panel 38 JPanel panel = new JPanel(); 39 panel.add(new JLabel("URL")); 40 panel.add(urlfelt); 41 panel.add(lastNed); 42 panel.add(tilbake); 43 44 contentPane.add(panel, BorderLayout.SOUTH); 45 } 46 47 private class Knappelytter implements ActionListener 48 { 49 public void actionPerformed(ActionEvent e) 50 { 51 if (e.getSource() == lastNed) 52 { 53 try 54 { // lagrer URL for tilbake-knapp 55 urlStakk.addFirst(urlfelt.getText()); 56 lerret.setPage(urlfelt.getText()); 57 } 58 catch (IOException ex) 59 { 60 lerret.setText("Feil: " + ex); 61 } 62 } 63 else if (e.getSource() == tilbake) 64 { 65 if (urlStakk.size() <= 1) 66 { 67 return; 68 } 69 try 70 { // henter lagret URL for tilbake-knapp 71 urlStakk.removeFirst(); //fjernet URL som vises nå 72 // viser URL for tilbake-knappen i tekstfeltet 73 String urlString = urlStakk.getFirst(); 74 urlfelt.setText(urlString); 75 lerret.setPage(urlString); 76 } 77 catch (IOException ex) 78 { 79 lerret.setText("Feil: " + ex); 80 } 81 } 82 } 83 } 84 85 //Nødvendig for at brukerens klikk på hyperlinker skal virke. 86 private class Hyperlinklytter implements HyperlinkListener 87 { 88 public void hyperlinkUpdate(HyperlinkEvent event) 89 { 90 if (event.getEventType() 91 == HyperlinkEvent.EventType.ACTIVATED) 92 { 93 try 94 { // lagrer URL for tilbake-knapp 95 URL url = event.getURL(); 96 urlStakk.addFirst(url.toString()); 97 // viser URL i tekstfelt 98 urlfelt.setText(url.toString()); 99 lerret.setPage(url); 100 } 101 catch (IOException e) 102 { 103 lerret.setText("Feil: " + e); 104 } 105 } 106 } 107 } 108 } 109 110 public class EditorPaneTest 111 { 112 public static void main(String[] args) 113 { 114 EventQueue.invokeLater(new Runnable() 115 { 116 public void run() 117 { 118 JFrame vindu = new URLframviser2(); 119 vindu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 120 vindu.setVisible(true); 121 } 122 }); 123 } 124 }
Copyright © Kjetil Grønning og Eva Hadler Vihovde, revidert 2014
![]() |
![]() |
Start på kapittel om spesialiserte komponenter for grafiske brukergrensesnitt |