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

Bruk av verktøylinje: JToolBar

En verktøylinje består vanligvis av en rad av knapper for de mest brukte operasjoner i et program. Den kan inneholde andre komponenter enn vanlige knapper, for eksempel kombobokser og tekstfelter. En verktøylinje er vanligvis horisontal. Den kan også være vertikal.

I java kan en verktøylinje opprettes som et objekt av type JToolBar:

  JToolBar verktøylinje = new JToolBar();

Komponentene den skal inneholde må opprettes på vanlig måte og knyttes til lytteobjekt:

  JButton knapp = new JButton( ... );
  knapp.addActionListener( ... );

Komponentene legges inn i verktøylinja ved bruk av add-metoden til denne:

  verktøylinje.add(knapp);

Om vi ønsker det, kan vi legge inn mellomrom mellom komponentene:

  verktøylinje.addSeparator(new Dimension(m, n));

Dersom vi ikke bestemmer noe annet, kan en verktøylinje dras (ved å gripe tak i dra-feltet som den har) til en av de andre sidene av den containeren som den ligger i, eller dras helt eller delvis ut av det vinduet den tilhører. Dersom vi har dratt den ut av vinduet og lukker den med den lukkeknappen som den da vil ha fått, så vil den smette på plass igjen til det stedet i vinduet vi dro den ut ifra. En forutsetning for at dra-funksjonaliteten skal virke er imidlertid at den containeren som verktøylinja ligger i har BorderLayout. Dessuten må verktøylinja være den eneste komponenten i containeren, med unntak av den komponenten som verktøylinja skal innvirke på, og denne må være i CENTER-posisjon. Dersom vi ikke ønsker å ha denne dra-funksjonaliteten, kan vi slå den av ved å skrive

  verktøylinje.setFloatable(false);

Eksempel 1

Programmet ToolBarDemo.java som er hentet fra The Java Tutorials har en verktøylinje som har den nevnte dra-funksjonaliteten. Bildet under viser programvinduet etter at det etter tur er klikket på de tre knappene på verktøylinja. Teksten blir skrevet ut i et tekstområde som ligger i senterposisjon i BorderLayout'en.

Det neste bildet viser samme programvindu etter at verktøylinja er dratt til venstre side av tekstområdet.

På bildene under er verktøylinja dratt helt ut av det vinduet den tilhører. Vi ser at den dialogboksen den blir vist i da også er utstyrt med den tittelteksten som ble brukt som konstruktørparameter for JToolBar-objektet.

Ikoner for de tre knappene på verktøylinja finnes i filene images/Back24.gif, images/Up24.gif og images/Forward24.gif. Programmet er gjengitt nedenfor.

  1 import javax.swing.JToolBar;
  2 import javax.swing.JButton;
  3 import javax.swing.ImageIcon;
  4 import javax.swing.JFrame;
  5 import javax.swing.JTextArea;
  6 import javax.swing.JScrollPane;
  7 import javax.swing.JPanel;
  8 import javax.swing.SwingUtilities;
  9 import javax.swing.UIManager;
 10
 11 import java.net.URL;
 12
 13 import java.awt.BorderLayout;
 14 import java.awt.Dimension;
 15 import java.awt.event.ActionEvent;
 16 import java.awt.event.ActionListener;
 17
 18 public class ToolBarDemo extends JPanel implements ActionListener
 19 {
 20   protected JTextArea textArea;
 21   protected String newline = "\n";
 22   static final private String PREVIOUS = "previous";
 23   static final private String UP = "up";
 24   static final private String NEXT = "next";
 25
 26   public ToolBarDemo()
 27   {
 28     super(new BorderLayout());
 29
 30     //Create the toolbar.
 31     JToolBar toolBar = new JToolBar("Still draggable");
 32     addButtons(toolBar);
 33
 34     //Create the text area used for output.  Request
 35     //enough space for 5 rows and 30 columns.
 36     textArea = new JTextArea(5, 30);
 37     textArea.setEditable(false);
 38     JScrollPane scrollPane = new JScrollPane(textArea);
 39
 40     //Lay out the main panel.
 41     setPreferredSize(new Dimension(450, 130));
 42     add(toolBar, BorderLayout.PAGE_START);
 43     add(scrollPane, BorderLayout.CENTER);
 44   }
 45
 46   protected void addButtons(JToolBar toolBar)
 47   {
 48     JButton button = null;
 49
 50     //first button
 51     button = makeNavigationButton("Back24", PREVIOUS,
 52             "Back to previous something-or-other",
 53             "Previous");
 54     toolBar.add(button);
 55
 56     //second button
 57     button = makeNavigationButton("Up24", UP,
 58             "Up to something-or-other",
 59             "Up");
 60     toolBar.add(button);
 61
 62     //third button
 63     button = makeNavigationButton("Forward24", NEXT,
 64             "Forward to something-or-other",
 65             "Next");
 66     toolBar.add(button);
 67   }
 68
 69   protected JButton makeNavigationButton(String imageName,
 70           String actionCommand,
 71           String toolTipText,
 72           String altText)
 73   {
 74     //Look for the image.
 75     String imgLocation = "images/"
 76             + imageName
 77             + ".gif";
 78     URL imageURL = ToolBarDemo.class.getResource(imgLocation);
 79
 80     //Create and initialize the button.
 81     JButton button = new JButton();
 82     button.setActionCommand(actionCommand);
 83     button.setToolTipText(toolTipText);
 84     button.addActionListener(this);
 85
 86     if (imageURL != null)
 87     {                      //image found
 88       button.setIcon(new ImageIcon(imageURL, altText));
 89     }
 90     else
 91     {                                     //no image found
 92       button.setText(altText);
 93       System.err.println("Resource not found: "
 94               + imgLocation);
 95     }
 96
 97     return button;
 98   }
 99
100   public void actionPerformed(ActionEvent e)
101   {
102     String cmd = e.getActionCommand();
103     String description = null;
104
105     // Handle each button.
106     if (PREVIOUS.equals(cmd))
107     { //first button clicked
108       description = "taken you to the previous <something>.";
109     }
110     else if (UP.equals(cmd))
111     { // second button clicked
112       description = "taken you up one level to <something>.";
113     }
114     else if (NEXT.equals(cmd))
115     { // third button clicked
116       description = "taken you to the next <something>.";
117     }
118
119     displayResult("If this were a real app, it would have "
120             + description);
121   }
122
123   protected void displayResult(String actionDescription)
124   {
125     textArea.append(actionDescription + newline);
126     textArea.setCaretPosition(textArea.getDocument().getLength());
127   }
128
129   /**
130    * Create the GUI and show it. For thread safety, this method should be
131    * invoked from the event dispatch thread.
132    */
133   private static void createAndShowGUI()
134   {
135     //Create and set up the window.
136     JFrame frame = new JFrame("ToolBarDemo");
137     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
138
139     //Add content to the window.
140     frame.add(new ToolBarDemo());
141
142     //Display the window.
143     frame.pack();
144     frame.setVisible(true);
145   }
146
147   public static void main(String[] args)
148   {
149     //Schedule a job for the event dispatch thread:
150     //creating and showing this application's GUI.
151     SwingUtilities.invokeLater(new Runnable()
152     {
153       public void run()
154       {
155         //Turn off metal's use of bold fonts
156         UIManager.put("swing.boldMetal", Boolean.FALSE);
157         createAndShowGUI();
158       }
159     });
160   }
161 }

Eksempel 2

Programmet Knapperaddemo som er gjengitt nedenfor er en modifikasjon av programmet EditorPaneTest for visning av html-filer. På en verktøylinje er det plassert navigasjonsknapper for sidevisning, samt et tekstfelt som viser nettadressen til den sida som vises for øyeblikket. Det er lagt inn en adresse for startside og en egen knapp for å komme tilbake til denne. For at det skal være mulig å navigere både fram og tilbake mellom besøkte sider, blir hver ny side lagt inn bakerst i en liste, ikke på toppen av en stakk.

Knappene på verktøylinja har bare ikoner, men er i tillegg utstyrt med forklarende tooltiptekst. Ikonbildene finnes i filene images/middle.gif, images/left.gif, images/right.gif og images/home.gif. Siden verktøylinja også inneholder et tekstfelt, er det ikke hensiktsmessig å vise den vertikalt. Funksjonaliteten for å dra den til en annen posisjon er derfor slått av.

Følgende bilde viser programvinduets oppstartside.

  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 URLframviser extends JFrame
 10 {
 11   private JTextField urlfelt;
 12   private JButton lastNed, tilbake, fram, start;
 13   private JEditorPane lerret;
 14   private Knappelytter lytter = new Knappelytter();
 15   private Hyperlinklytter linklytter = new Hyperlinklytter();
 16   private JToolBar verktøylinje;
 17   private java.util.List<String> besøksliste = new ArrayList<>();
 18   //for lagring av besøkte adresser
 19   private int listeindeks = 0;
 20   private String startside =
 21           "http://docs.oracle.com/javase/tutorial/index.html";
 22
 23   public URLframviser()
 24   {
 25     setTitle("En enkel nettleser");
 26     setSize(800, 700);
 27
 28     verktøylinje = new JToolBar();
 29     //komponenter for verktøylinje:
 30     lastNed = new JButton(new ImageIcon(
 31             getClass().getResource("bilder/middle.gif")));
 32     lastNed.setToolTipText("Last ned / oppdater");
 33     lastNed.addActionListener(lytter);
 34     tilbake = new JButton(new ImageIcon(
 35             getClass().getResource("bilder/left.gif")));
 36     tilbake.setToolTipText("Tilbake");
 37     tilbake.addActionListener(lytter);
 38     fram = new JButton(new ImageIcon(
 39             getClass().getResource("bilder/right.gif")));
 40     fram.setToolTipText("Fram");
 41     fram.addActionListener(lytter);
 42     start = new JButton(new ImageIcon(
 43             getClass().getResource("bilder/home.gif")));
 44     start.setToolTipText("Startside");
 45     start.addActionListener(lytter);
 46     urlfelt = new JTextField(30);
 47     urlfelt.addActionListener(lytter);
 48     //legger inn komponentene i verktøylinja
 49     verktøylinje.add(tilbake);
 50     verktøylinje.add(lastNed);
 51     verktøylinje.add(fram);
 52     verktøylinje.add(start);
 53     verktøylinje.addSeparator();
 54     verktøylinje.add(new JLabel("Adresse"));
 55     verktøylinje.addSeparator(new Dimension(3, 0));
 56     verktøylinje.add(urlfelt);
 57     verktøylinje.setFloatable(false);
 58
 59     lerret = new JEditorPane();
 60     lerret.setEditable(false);
 61     lerret.addHyperlinkListener(linklytter);
 62
 63     Container contentPane = getContentPane();
 64     contentPane.add(new JScrollPane(lerret), BorderLayout.CENTER);
 65     contentPane.add(verktøylinje, BorderLayout.PAGE_START);
 66     besøksliste.add(listeindeks++, startside);
 67     urlfelt.setText(startside);
 68     nyURL(startside);
 69   }
 70
 71   //viser gitt URL og lagrer den i besøkslista
 72   public void nyURL(String adresse)
 73   {
 74     visURL(adresse);
 75     besøksliste.add(adresse);
 76     listeindeks = besøksliste.size() - 1;
 77   }
 78
 79   public void visURL(String adresse)
 80   {
 81     try
 82     {
 83       lerret.setPage(adresse);
 84     }
 85     catch (IOException ex)
 86     {
 87       lerret.setText("Feil: " + ex);
 88     }
 89   }
 90
 91   public String gåFram()
 92   {
 93     listeindeks++;
 94     if (listeindeks >= besøksliste.size())
 95     {
 96       listeindeks = besøksliste.size() - 1;
 97     }
 98     String adresse = besøksliste.get(listeindeks);
 99     visURL(adresse);
100     return adresse;
101   }
102
103   public String gåTilbake()
104   {
105     listeindeks--;
106     if (listeindeks < 0)
107     {
108       listeindeks = 0;
109     }
110     String adresse = besøksliste.get(listeindeks);
111     visURL(adresse);
112     return adresse;
113   }
114
115   public String gåTilStart()
116   {
117     listeindeks = 0;
118     visURL(startside);
119     return startside;
120   }
121
122   private class Knappelytter implements ActionListener
123   {
124     public void actionPerformed(ActionEvent e)
125     {
126       if (e.getSource() == lastNed)
127       {
128         nyURL(urlfelt.getText());
129       }
130       else if (e.getSource() == tilbake)
131       {
132         String adresse = gåTilbake();
133         urlfelt.setText(adresse);
134       }
135       else if (e.getSource() == fram)
136       {
137         String adresse = gåFram();
138         urlfelt.setText(adresse);
139       }
140       else if (e.getSource() == start)
141       {
142         String adresse = gåTilStart();
143         urlfelt.setText(adresse);
144       }
145     }
146   }
147
148   //Nødvendig for at brukerens klikk på hyperlinker skal virke.
149   private class Hyperlinklytter implements HyperlinkListener
150   {
151     public void hyperlinkUpdate(HyperlinkEvent event)
152     {
153       if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
154       {
155         URL url = event.getURL();
156         nyURL(url.toString());
157         urlfelt.setText(url.toString());
158       }
159     }
160   }
161 }  //class URLframviser
162
163 public class Knapperaddemo
164 {
165   public static void main(String[] args)
166   {
167     SwingUtilities.invokeLater(new Runnable()
168     {
169       public void run()
170       {
171         JFrame vindu = new URLframviser();
172         vindu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
173         vindu.setVisible(true);
174       }
175     });
176   }
177 }

Copyright © Kjetil Grønning, revidert av Eva Hadler Vihovde 2014

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