# JPanel: LayoutManager und trotzdem absolut positionieren?



## professorchimp (8. Apr 2009)

Hallo,
gibt es eine möglichkeit wie ich, obwohl ich für ein JPanel einen LayoutManager benutze, eine einzelne komponente absolut platzieren kann?

thx für eure hilfe


----------



## Hadernlump (8. Apr 2009)

Das wiederspricht sich irgendwie, was hast du denn genau vor, vll. kann man das anderst lösen


----------



## Ebenius (8. Apr 2009)

Da schmeiß ich doch mal wieder die staubige Kristallkugel an: Willst Du vielleicht eine bestimmte Komponente hinter all den anderen darstellen? Sofern das stimmt und diese Komponente keine Eingaben braucht, kannst Du ein JLayeredPane benutzen. OverlayLayout drauf und ein JPanel mit dem richtigen Layout in den Vordergrund; ein JPanel ohne Layout (und mit der _besonderen_ Komponente) in den Hintergrund.

Ebenius


----------



## André Uhres (15. Apr 2009)

professorchimp hat gesagt.:


> gibt es eine möglichkeit wie ich, obwohl ich für ein JPanel einen LayoutManager benutze, eine einzelne komponente absolut platzieren kann?


Vielleicht könnte ein LayoutManger helfen, der absolute Positionierung ermöglicht. Etwa so:

```
/* AbsoluteLayout.java
usage example:
jPanel1.setLayout(new AbsoluteLayout());
bt = new JButton("Test");
jPanel1.add(bt, new AbsoluteConstraints(100, 100));
 */

import java.awt.*;
import java.io.*;
import java.util.*;

public class AbsoluteLayout implements LayoutManager2, Serializable {

    static final long serialVersionUID = 0xe55b4b7098765c98L;
    protected Hashtable constraints;

    public AbsoluteLayout() {
        constraints = new Hashtable();
    }

    public void addLayoutComponent(final String s, final Component component) {
        throw new IllegalArgumentException();
    }

    public void removeLayoutComponent(final Component component) {
        constraints.remove(component);
    }

    public Dimension preferredLayoutSize(final Container container) {
        int i = 0;
        int j = 0;
        Enumeration enumeration = constraints.keys();
        do {
            if (!enumeration.hasMoreElements()) {
                break;
            }
            Component component = (Component) enumeration.nextElement();
            AbsoluteConstraints absoluteconstraints = (AbsoluteConstraints) constraints.get(component);
            Dimension dimension = component.getPreferredSize();
            int k = absoluteconstraints.getWidth();
            if (k == -1) {
                k = dimension.width;
            }
            int l = absoluteconstraints.getHeight();
            if (l == -1) {
                l = dimension.height;
            }
            if (absoluteconstraints.x + k > i) {
                i = absoluteconstraints.x + k;
            }
            if (absoluteconstraints.y + l > j) {
                j = absoluteconstraints.y + l;
            }
        } while (true);
        return new Dimension(i, j);
    }

    public Dimension minimumLayoutSize(final Container container) {
        int i = 0;
        int j = 0;
        Enumeration enumeration = constraints.keys();
        do {
            if (!enumeration.hasMoreElements()) {
                break;
            }
            Component component = (Component) enumeration.nextElement();
            AbsoluteConstraints absoluteconstraints = (AbsoluteConstraints) constraints.get(component);
            Dimension dimension = component.getMinimumSize();
            int k = absoluteconstraints.getWidth();
            if (k == -1) {
                k = dimension.width;
            }
            int l = absoluteconstraints.getHeight();
            if (l == -1) {
                l = dimension.height;
            }
            if (absoluteconstraints.x + k > i) {
                i = absoluteconstraints.x + k;
            }
            if (absoluteconstraints.y + l > j) {
                j = absoluteconstraints.y + l;
            }
        } while (true);
        return new Dimension(i, j);
    }

    public void layoutContainer(final Container container) {
        Component component;
        AbsoluteConstraints absoluteconstraints;
        int i;
        int j;
        for (Enumeration enumeration = constraints.keys(); enumeration.hasMoreElements(); component.setBounds(absoluteconstraints.x, absoluteconstraints.y, i, j)) {
            component = (Component) enumeration.nextElement();
            absoluteconstraints = (AbsoluteConstraints) constraints.get(component);
            Dimension dimension = component.getPreferredSize();
            i = absoluteconstraints.getWidth();
            if (i == -1) {
                i = dimension.width;
            }
            j = absoluteconstraints.getHeight();
            if (j == -1) {
                j = dimension.height;
            }
        }

    }

    public void addLayoutComponent(final Component component, final Object obj) {
        if (!(obj instanceof AbsoluteConstraints)) {
            throw new IllegalArgumentException();
        } else {
            constraints.put(component, obj);
            return;
        }
    }

    public Dimension maximumLayoutSize(final Container container) {
        return new Dimension(0x7fffffff, 0x7fffffff);
    }

    public float getLayoutAlignmentX(final Container container) {
        return 0.0F;
    }

    public float getLayoutAlignmentY(final Container container) {
        return 0.0F;
    }

    public void invalidateLayout(final Container container) {
    }
}

class AbsoluteConstraints implements Serializable {

    static final long serialVersionUID = 0x490476a535ef832eL;
    public int x;
    public int y;
    public int width;
    public int height;

    public AbsoluteConstraints(final Point point) {
        this(point.x, point.y);
    }

    public AbsoluteConstraints(final int x1, final int y1) {
        width = -1;
        height = -1;
        x = x1;
        y = y1;
    }

    public AbsoluteConstraints(final Point point, final Dimension dimension) {
        width = -1;
        height = -1;
        x = point.x;
        y = point.y;
        if (dimension != null) {
            width = dimension.width;
            height = dimension.height;
        }
    }

    public AbsoluteConstraints(final int x1, final int y1, final int width1, final int height1) {
        width = -1;
        height = -1;
        x = x1;
        y = y1;
        width = width1;
        height = height1;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    @Override
    public String toString() {
        return super.toString() + " [x=" + x + ", y=" + y + ", width=" + width + ", height=" + height + "]";
    }
}
```


----------

