Wie kann man die genaue Größe und Position einer Komponente in einem Layout ermitteln?
Das Beispiel zeigt einen kleinen JFrame
mit
zentralem JPanel
. In einem GridBagLayout
sind dort fünf Komponenten positioniert. Dies
erfolgt in der Methode doLayout()
ab Zeile
35. Dort wird am Ende in Zeile 72 die Methode showBorders()
aufgerufen. Ihr wird der Container der Komponenten als
Parameter übergeben.
Die Methode speichert alle Komponenten des Panels in
einem Array indem sie den Inhalt des übergebenen
Containers durch getComponents()
ausliest.
Die ermittelten Komponenten werden mit
verschiedenfarbigen Rändern versehen. Hierzu wird
das Array in einer Schleife durchlaufen und für die
drei Farbanteile rot, grün und blau jeweils ein
Zufallswert erstellt. Das hiermit erzeugte Color
-Objekt
wird zum Einfärben des äußeren LineBorder
-Anteils
einer CompoundBorder
verwendet. Als innerer
Rand bleibt, falls vorhanden, der native Rand der
jeweiligen Komponente erhalten. Zur Erzeugung und
Verwendung von Rändern siehe auch den Artikel
über Ränder und Abstände.
import java.awt.Color; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.util.Random; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class DimensionenZeigen { public DimensionenZeigen() { init(); } private void init() { JPanel panel = new JPanel(new GridBagLayout()); doLayout(panel); JFrame frame = new JFrame(); frame.add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Komponentendimensionen anzeigen"); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } private void doLayout(JPanel panel) { GridBagConstraints con = new GridBagConstraints(); JLabel hLabel = new JLabel("Hallo"); con.gridx = 0; con.gridy = 0; con.gridwidth = 1; con.gridheight = 1; panel.add(hLabel, con); JLabel wLabel = new JLabel("Welt!"); con.gridx = 1; con.gridy = 0; con.gridwidth = 2; con.gridheight = 1; panel.add(wLabel, con); JTextArea area = new JTextArea(5, 5); con.gridx = 0; con.gridy = 1; con.gridwidth = 4; con.gridheight = 2; panel.add(area, con); JButton butt = new JButton("klick"); con.gridx = 3; con.gridy = 2; con.gridwidth = 1; con.gridheight = 1; panel.add(butt, con); JTextField field = new JTextField(); con.gridx = 2; con.gridy = 3; con.gridwidth = 1; con.gridheight = 1; panel.add(field, con); showBorders(panel); } private void showBorders(JComponent component) { Component[] c = component.getComponents(); int r = 255, g = 255, b = 255; Random rand = new Random(); for (Component comp : c) { r = rand.nextInt(240); g = rand.nextInt(240); b = rand.nextInt(240); if (comp instanceof JComponent) { JComponent jcomp = (JComponent) comp; jcomp.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(new Color(r, g, b), 3), jcomp.getBorder())); } } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new DimensionenZeigen()); } }
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.