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

Litt om bruk av rammer (borders)

Hver JComponent kan ha en eller flere rammer. Rammer kan brukes til å tegne linjer og kanter av forskjellig type rundt komponenten, til å utstyre den med en tittel, og til å legge inn tomt rom rundt komponenten. Rammer er objekter av type Border.

Det blir anbefalt at man bare setter ramme på komponenter av type JPanel og JLabel. Dersom en ønsker å sette ramme rundt en annen type komponent, blir det anbefalt at man legger denne inn i et JPanel og så setter ramme på dette panelet.

For å sette ramme rundt en komponent, brukes komponentens setBorder-metode med rammeobjektet som parameter. Klassen BorderFactory inneholder static-metoder som genererer og returnerer objekter av de vanlige rammetypene:

Det er de samme skrittene som må utføres, uansett hvilken type ramme man velger å bruke. Skrittene er som følger:

  1. Gjør kall på en static-metode til BorderFactory for å få ønsket rammetype. Eksempel:
    Border ramme = BorderFactory.createLineBorder( Color.BLACK );
  2. I tilfelle du ønsker ramme med tittel:
    Border tittelramme = BorderFactory.createTitledBorder( ramme, "En tittel" );
  3. I tilfelle du ønsker å kombinere flere rammetyper:
    Border kombiramme = BorderFactory.createCompoundBorder( ytreRamme, indreRamme );
    (med Border-objekter som parametre )
  4. Sette ramme for komponenten:
    komponent.setBorder( ramme );

Til de forskjellige rammetypene finnes det diverse muligheter for å sette rammebredde og farger. I tillegg til de nevnte typene rammer finnes det for skråkanttypene en variant som har avrundede hjørner. Denne varianten er for begge skråkanttypene definert av klassen SoftBevelBorder. Klassen LineBorder definerer også en variant med avrundede hjørner. For variantene med avrundede hjørner finnes det imidlertid ingen static-metode for å opprette rammen. Isteden må man bruke en av konstruktørene til de to klassene.

Programeksempler

Eksempel 1

Programmet BorderTest.java er det gjengitt kode for nedenfor. Programmet demonstrerer de forskjellige enkle rammetypene, alle uten tittel. Når programmet kjøres, starter det opp med vinduet som er vist på følgende bilde.

 1 /**
 2  * @version 1.20 27 Jun 1997
 3  * @author Cay Horstmann
 4  */
 5 import java.awt.*;
 6 import java.awt.event.*;
 7 import javax.swing.*;
 8 import javax.swing.border.*;
 9
10 class BorderFrame extends JFrame implements ActionListener
11 {
12
13   private ButtonGroup group;
14
15   public BorderFrame()
16   {
17     JPanel buttonPanel = new JPanel();
18     group = new ButtonGroup();
19     addRadioButton(buttonPanel, group, "Lowered bevel", true);
20     addRadioButton(buttonPanel, group, "Raised bevel", false);
21     addRadioButton(buttonPanel, group, "Etched", false);
22     addRadioButton(buttonPanel, group, "Line", false);
23     addRadioButton(buttonPanel, group, "Matte", false);
24     addRadioButton(buttonPanel, group, "Empty", false);
25
26     Border etched = BorderFactory.createEtchedBorder();
27     Border titled = BorderFactory.createTitledBorder(etched,
28             "Border types");
29     buttonPanel.setBorder(titled);
30
31     getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
32
33     setDemoPanel();
34
35     setTitle("BorderTest");
36     setSize(600, 200);
37     addWindowListener(new WindowAdapter()
38     {
39       public void windowClosing(WindowEvent e)
40       {
41         System.exit(0);
42       }
43     });
44   }
45
46   public void addRadioButton(JPanel buttonPanel, ButtonGroup g,
47           String buttonName, boolean v)
48   {
49     JRadioButton button = new JRadioButton(buttonName, v);
50     button.addActionListener(this);
51     g.add(button);
52     buttonPanel.add(button);
53     button.setActionCommand(buttonName); // bestemmer en streng som 
54     //kan brukes til å identifisere knappen når den blir klikket på
55   }
56
57   public void actionPerformed(ActionEvent evt)
58   {
59     setDemoPanel();
60   }
61
62   public void setDemoPanel()
63   {
64     JPanel panel = new JPanel();
65     Border border = null;
66     // henter ut identifikasjonsstrengen for den knappen som nå er 
67     // blitt klikket på
68     String command = group.getSelection().getActionCommand();
69     if (command.equals("Lowered bevel"))
70       border = BorderFactory.createLoweredBevelBorder();
71     else if (command.equals("Raised bevel"))
72       border = BorderFactory.createRaisedBevelBorder();
73     else if (command.equals("Etched"))
74       border = BorderFactory.createEtchedBorder();
75     else if (command.equals("Line"))
76       border = BorderFactory.createLineBorder(Color.blue);
77     else if (command.equals("Matte"))
78       border = BorderFactory.createMatteBorder(10, 10, 10, 10,
79               Color.blue);
80     else if (command.equals("Empty"))
81       border = BorderFactory.createEmptyBorder();
82
83     panel.setBorder(border);
84     getContentPane().add(panel, BorderLayout.CENTER);
85     validate();
86   }
87 }
88
89 public class BorderTest
90 {
91   public static void main(String[] args)
92   {
93     JFrame frame = new BorderFrame();
94     frame.setVisible(true);
95   }
96 }

Eksempel 2

Programmet BorderDemo.java er en del mer komplisert. Det er hentet fra The Java Tutorial. Det viser mange eksempler på rammer, enkle og sammensatte. Programmet gjør bruk av bildefila wavy.gif som må ligge i underkatalogen images i forhold til programmets class-fil. Ved kjøring starter programmet opp med å vise vinduet som er gjengitt på følgende bilde.

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

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