![]() |
![]() |
Start på kapittel om spesialiserte komponenter for grafiske brukergrensesnitt |
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);
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 }
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
![]() |
![]() |
Start på kapittel om spesialiserte komponenter for grafiske brukergrensesnitt |