Forrige avsnitt Neste avsnitt  Start på kapittel om spesialiserte komponenter for grafiske brukergrensesnitt

Bruk av 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.

Parameteren til metoden 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.

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

Forrige avsnitt Neste avsnitt  Start på kapittel om spesialiserte komponenter for grafiske brukergrensesnitt