getInsets ohne Layoutmanager

  • Themenstarter Themenstarter riker
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
R

riker

Gast
Hallo,

ich bin gerade dabei, ein wenig mit AWT zu programmieren. Dabei möchte ich gerne auf den Layoutmanager verzichten. Um aber ein Panel nicht über das gesamte Fenster, sondern nur über den Anwendungsbereich aufzuspannen, benötige ich ja die Abmessungen von Titelleiste und Fensterrahmen. Die passende Methode getInsets() liefert bei mir aber nur Nullen, wenn ich den Layoutmanager meines Frames deaktiviert habe.

Ist es denn so unüblich, ohne den Manager zu arbeiten? Bei einfachen Programmen stört er mich einfach, zumal er doch gar nicht wissen kann, wo ich meine Steuerelemente platziert haben möchte. Und warum funktioniert das Abfragen der Rahmengrößen nicht mehr?

Gruß,
riker
 
>Die passende Methode getInsets() liefert bei mir aber nur Nullen,
>wenn ich den Layoutmanager meines Frames deaktiviert habe.
Bei mir liefert sie in dem Fall: java.awt.Insets[top=30,left=4,bottom=4,right=4]

>Ist es denn so unüblich, ohne den Manager zu arbeiten?
Ja

>zumal er doch gar nicht wissen kann, wo ich meine Steuerelemente platziert haben möchte.
Dazu gibt es die "constraints".
http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html
 
Naja, danke erstmal. Aber ganz ehrlich, für sehr kleine Programme wirkt das ganze für mich wie "Overkill". Mag ja sein, dass dieser Manager einem bei riesigen Projekten und hunderten von Steuerelementen behilflich ist, aber an dieser Stelle kann ich ihn einfach nicht gebrauchen.

Gibt es also in Java bzw. AWT tatsächlich keine andere Möglichkeit, die Abmessungen des Fensterrahmens abzufragen, unabhängig davon, ob der Layoutmanager aktiviert ist oder nicht?
 
Eineb LayoutManager kann auch bei wenigen Elementen nutzen. Ohne LayoutManager handelt man sich nämlich einiges an "Overkill" ein.

- Verschiedene Look & Feels:
Unter verschiedenen Look & Feels (und je nach OS) sind die Größen der einzelnen Elemente unterschiedlich (Ränder etc.).
Ohne LayoutManager musst du immer aufpassen, das unter allen Möglichkeiten alle Elemente sauber sichtbar sind.
- Fensterskalierung bekommt man mit einem LayoutManager geschenkt, ohne LayoutManager verzichtet man entweder drauf oder muss händisch mit Listenern reagieren und selber sein Layout berechnen.
- Widgets lassen sich später einfach durch andere Widgets ersetzen, ohne das man viel am Layout machen muss. Hat man manuell harte Größen kodiert kann man den Taschenrechner auspacken - Hats man selber berechnet hätte man auch gleich einen LayoutManager nehmen können.

Daher ist es eigentlich so gut wie nie sinnvoll auf einen LayoutManager zu verzichten.
 
Ok, ihr fangt an, mich zu überzeugen. Sagen wir mal, ich möchte mein Fenster in zwei Bereiche unterteilen, also eine vertikale Trennung vornehmen. Wahrscheinlich sollte ich dazu zwei Panels erstellen. Das eine soll sich ganz rechts befinden, einige Steuerelemente beinhalten und eigentlich eine konstante Breite (Höhe je nach Fensterhöhe) besitzen.

Das zweite Panel soll dann den links davon übrig bleibenden Platz des Anwendungsbereichs ausnutzen und dann halt auch automatisch bei einer Größenänderung des Fenster mit angepasst werden. Die Layouts der einzelnen Panels sind ja erst einmal egal.

Könntet ihr mir eventuell sagen, wie ich das mit Hilfe des Layoutmanagers meines Frames umsetzen kann?
 
BorderLayout nehmen, das Panel ganz rechts kommt in den EAST Bereich (EAST = Höhe dynamsich an Fenster anpassen, Breite fest auf der PreferredSize) und das linke kommt in den CENTER Bereich (CENTER = nimmt den restlichen Bereich ein). 3 Zeilen Code, fertig 🙂
 
Gut, ich habe jetzt folgendes:

Code:
setLayout(new BorderLayout());		
add(spielfeld, BorderLayout.CENTER);
add(panel, BorderLayout.EAST);

Wie genau sage ich jetzt dem "panel", dass es eine feste Breite von x Pixeln einnehmen soll? setPreferredSize() gibt es nur als Version, die einen Dimension-Typ erwartet, also anscheinend direkt Breite und Höhe. Die Höhe soll aber doch an das Fenster angepasst werden, lediglich die Breite soll konstant sein.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben