Wie kann man die genaue Größe und Position einer Komponente in einem Layout ermitteln?

Besonders in Containern mit komplexem Layout kann es vorkommen, dass die Ursachen von Fehlern nicht offensichtlich sind. Hierbei kann es hilfreich sein, die Größen und Positionen beteiligter Komponenten eindeutig zu bestimmen und zu visualisieren.

Sichtbarmachen von Positionen und Größen von Komponenten in einem Container

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.