Wie werden Komponenten mit Rändern versehen?
Anwendung
Alle von JComponent
abgeleiteten
Komponenten haben einen oder sogar mehrere Ränder,
die nach eigenen Vorstellungen konfiguriert oder auch
entfernt werden können. Sie bestimmen die
Erscheinung der gezeichneten Kanten und Ecken. Mehrere
Ränder können miteinander kombiniert werden
oder auch einen unsichtbaren Leerraum definieren, der
den Abstand nach außen oder innen bestimmt.
Das Hinzufügen einer Border
findet
durch die Methode JComponent#setBorder()
statt und kann auf jede von JComponent
abgeleitete Komponente angewendet werden.
Oracle
empfiehlt das direkte Zuweisen einer selbst definierten
Border
jedoch nur für JLabel
und JPanel
. Für alle anderen
Komponenten wird geraten, diese in ein JPanel
einzubetten und den Rand statt dessen diesem zuzuweisen.1
Der folgende Quelltext erzeugt die unten
als Beispiele gezeigten Fenster. An der Stelle
der Kommentare // Border
und // Labeltext
muss dabei das unter der jeweiligen Abbildung gezeigte
Quelltextfragment eingetragen werden.
import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; public class Borders { public Borders() { init(); } private void init() { GridLayout gl = new GridLayout(1,1); JPanel outerPanel = new JPanel(gl); outerPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); JPanel innerPanel = new JPanel(gl); innerPanel.setPreferredSize(new Dimension(450, 100)); outerPanel.add(innerPanel); JLabel label = new JLabel(); label.setHorizontalAlignment(SwingConstants.CENTER); innerPanel.add(label); innerPanel.setBorder( // Border ); label.setText("<html>" + // Labeltext + "</html>"); JFrame frame = new JFrame(); frame.setContentPane(outerPanel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Borders"); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new Borders()); } }
Erzeugung von Border
-Objekten
Ein Border
-Objekt kann auf zweierlei Weise
erzeugt werden:
- durch den Aufruf eines der Konstruktoren einer
Border
-Klasse, z.B.
EtchedBorder b = new EtchedBorder();
- durch Nutzung der Klasse
BorderFactory
und ihrer statischen Methoden, z.B.
EtchedBorder b = BorderFactory.createEtchedBorder();
Worin besteht der Unterschied? Das sichtbare Ergebnis
ist in beiden Fällen das gleiche. Tatsächlich
scheint der Grund für diese Doppelung eher ein
historischer zu sein: Wärend bei Nutzung der
Konstruktoren jedes Mal ein neues Objekt erzeugt wird,
speichert BorderFactory
einige der
einfachen Border
-Objekte als Konstanten, um
bei häufiger Verwendung Speicherplatz zu sparen:
public class BorderFactory { static final Border sharedRaisedBevel = new BevelBorder(0); static final Border sharedLoweredBevel = new BevelBorder(1); private static Border sharedSoftRaisedBevel; private static Border sharedSoftLoweredBevel; static final Border sharedEtchedBorder = new EtchedBorder(); private static Border sharedRaisedEtchedBorder; static final Border emptyBorder = new EmptyBorder(0, 0, 0, 0); private static Border sharedDashedBorder; //... }
Der Einheitlichkeit halber wird bei den folgenden
Beispielen ausschließlich BorderFactory.createXXXBorder()
verwendet.
Beispiele
Abstände durch EmptyBorder
Eine EmptyBorder
definiert einen Leerraum
zwischen der äußeren Grenze der Komponente und
ihrem Inhalt und ist somit hervorragend geeignet,
Abstände einzurichten. Sie können dem
Konstruktor für alle vier Positionen getrennt in
der folgenden Reihenfolge übergeben werden: oben,
links, unten, rechts.
Müssen die genauen Abstände einer EmptyBorder
ermittelt werden, so können die Insets
der EmptyBorder
durch deren Methode getBorderInsets()
zurückgegeben werden. Die beiden folgenden
Abbildungen verdeutlichen die Eigenschaften einer EmptyBorder
durch Setzen eines farbigen Hintergrundes des Labels.
Einfache Ränder
Ränder mit Titel (TitledBorder)
Zusammengesetzte Ränder (CompoundBorder)
Eine CompoundBorder
besteht aus zwei
beliebigen, getrennt definierten Border
-Objekten.
Da sie ihrerseits wiederum aus CompoundBorder
-Objekten
bestehen können, ist eine Fülle an
Kombinationsmöglichkeiten gegeben.
Quellen
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.