Swing JPanel Nur Breite festlegen

Nachtfalke

Aktives Mitglied
Hallo zusammen,

ich möchte bei einem JPanel nur die Breite vorgeben. Die Länge soll automatisch so gesetzt werden, daß alle Komponenten auf dem JPanel angezeigt werden können. Mit setPreferredSize kann ich aber immer nur beide Dimensionen setzen. Hat jemand eine Idee, wie ich Java sagen kann, daß ich nur die Breite fixieren möchte?
 
Zuletzt bearbeitet von einem Moderator:
Müsste hiermit klappen

Java:
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(hier deine Breite, panel.getPreferredSize().height));

EDIT: Sry war Mist was ich da gepostet habe. Das Panel hat ja erst nach dem Zeichnen ein preferredSize...sry
 
Zuletzt bearbeitet:
Hallo,

probier es doch mal so:

Mach ein .pack() auf das JFrame oder ein .doLayout() auf dein JPanel (funktioniert beides auch bevor die Komponenten sichtbar gemacht werden).

Dann funktioniert auch der Vorschlag von Fleur de Soleil mit dem .setPreferredSize().

MfG
hansmueller
 
Wirklich "dynamisch" ist das aber nicht. IMHO wäre eine Möglichkeit dafür grob sowas
Java:
class PreferredWidthPanel extends JPanel
{
    private int preferredWidth = 100;

    public void setPreferredWidth(int preferredWidth)
    {
        this.preferredWidth = preferredWidth;
    }

    @Override
    public Dimension getPreferredSize()
    {
        Dimension dim = super.getPreferredSize();
        if (isPreferredSizeSet())
        {
            return dim;
        }
        dim.width = preferredWidth;
        return dim;
    }
}
 
Müsste hiermit klappen

Java:
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(hier deine Breite, panel.getPreferredSize().height));

EDIT: Sry war Mist was ich da gepostet habe. Das Panel hat ja erst nach dem Zeichnen ein preferredSize...sry

Falsch! "getPreferredSize()" des JPanels leitet an die Methode "preferredLayoutSize(Container)" des gesetzten LayoutManagers weiter und dieser kann natürlich nur etwas zurückgeben, wenn bereits Componenten auf dem JPanel geaddet wurden, aber sichtbar oder bereits gezeichnet müssen sie dafür nicht sein. Außerdem bringt es bei manchen LayoutManagern nichts eine PrefSize anzugeben. Das ist keine Garantie, dass diese sich daran halten.

Also: Ein wirklich guter Weg, ohne an der JPanel Klasse rumzubasteln (was ziemlich ineffektiv ist), ist es einen eigenen LayoutManager zuschreiben. Ist auch nicht sonderlich schwer. 🙂
 
Nun.... das "ineffektiv" ist etwas zu unfundiert, als dass es wert wäre, in Frage gestellt zu werden. (Ooops 😳 😀 ). Aber wenn man eine Component haben will, die eine feste aber beliebige Breite, und eine vom Inhalt abhängige Höhe haben soll, und diese Component dann sowohl in einem Container mit BorderLayout als auch in einem mit BoxLayout oder FlowLayout genau dieses Verhalten haben soll, muss man eben dafür sorgen, dass sie dieses Verhalten hat. Das ist ja Sache der Component, und nicht des übergeordneten Containers... :bahnhof:
 
Na nee. Das ist eine Layout-Sache, daher ist der Weg über einen LayoutManager besser, finde ich. Denn immerhin sind sie dafür da. Natürlich muss man beim Gesamt Layout auch den übergeordneten Container beachten, keine Frage, aber das muss man mit deiner PrefSize Lösung ebenfalls, jedoch setzt man daduch an einer falschen Stelle an. 😉

Na ja, ansonsten könnte man evtl. die "reshape(int, int, int, int)" Methode überschreiben, den alle Positions- und Größenveränderung werden an diese methode weitergeleitet. Aber das bricht natürlich jedes festgelegte Layout.
Java:
JPanel myPanel = new JPanel() {
	@Override public void reshape(int x, int y, int w, int h) {
		super.reshape(x, y, 200, h);
	}
};
Was mir noch in den Kopf kommt ist die JViewPort Klasse. Aber die habe ich noch nie direkt benutzt. :-/
 
Nun, es ist nicht wert, darüber zu streiten, es kommt wohl auch auf den Anwendungskontext an, aber... Wenn man eine Component will, die eine feste Breite hat, und noch nicht weiß, wer diese Component in welchem Layout verwenden will, wird es mit Alternativen zur Preferred/Max/Min-Size eben schnell dünn...
Ist wohl auch nicht so wichtig.
 

Zurück
Oben