Komponenten werden nicht angezeigt

Status
Nicht offen für weitere Antworten.

marasek

Aktives Mitglied
Ich bin jetzt schon mehrfach über ein Verhalten von Java gestolpert: wenn man bei einer Komponente setLayout(null) macht und dann die Position nicht mit setBounds() u. ä. angibt, wird sie nicht angezeigt. Das Verhalten find ich gaga, ich würde erwarten, dass es entweder eine Fehlermeldung gibt oder die Komponente mit Standardwerten angezeigt wird. So kann ja fröhliches Bugsuchen beginnen - die Komponente könnte ja ebenso gut nicht angezeigt werden, weil man irgendwo eine falsche Kondition drin hat usw. usf.

Fast noch schlimmer als (null), wie seht ihr das?
 

André Uhres

Top Contributor
Ich bin jetzt schon mehrfach über ein Verhalten von Java gestolpert: wenn man bei einer Komponente setLayout(null) macht und dann die Position nicht mit setBounds() u. ä. angibt, wird sie nicht angezeigt. Das Verhalten find ich gaga, ich würde erwarten, dass es entweder eine Fehlermeldung gibt oder die Komponente mit Standardwerten angezeigt wird. So kann ja fröhliches Bugsuchen beginnen - die Komponente könnte ja ebenso gut nicht angezeigt werden, weil man irgendwo eine falsche Kondition drin hat usw. usf.

Fast noch schlimmer als (null), wie seht ihr das?
Die Bounds, also die Position und Grösse einer Komponente, sind Sache des Layoutmanagers. Deshalb raten wir, immer einen solchen zu benutzen. Wenn wir absolute Positionierung benötigen, ist es oft besser einen Layoutmanager zu benutzen, der das macht und die PreferredSize respektiert, anstatt keinen Layoutmanager zu benutzen. Hier ist ein Beispiel eines solchen Layoutmanagers:
Code:
import java.awt.*;
import java.util.*;

public class AbsoluteLayout implements LayoutManager2 {

    protected Vector components = new Vector();

    public void addLayoutComponent(final String name, final Component component) {
        addLayoutComponent(component, null);
    }

    public void addLayoutComponent(final Component component, final Object constraints) {
        if (component == null) {
            return;
        }
        components.add(component);
    }

    public void removeLayoutComponent(final Component component) {
        if (component != null) {
            components.remove(component);
        }
    }

    public Dimension minimumLayoutSize(final Container parent) {
        return preferredLayoutSize(parent);
    }

    public Dimension preferredLayoutSize(final Container parent) {
        Rectangle limits = null;
        Rectangle bounds = null;
        for (int i = 0; i < components.size(); i++) {
            Component c = (Component) components.get(i);
            bounds = getPreferredBounds(c);
            if (limits == null) {
                limits = bounds;
            } else {
                limits = limits.union(bounds);
            }
        }
        if (limits == null) {
            return new Dimension();
        }
        Insets insets = parent.getInsets();
        if (insets == null) {
            insets = new Insets(0, 0, 0, 0);
        }
        int w = limits.width + insets.left + insets.right;
        int h = limits.height + insets.top + insets.bottom;
        return new Dimension(w, h);
    }

    public Dimension maximumLayoutSize(final Container parent) {
        return preferredLayoutSize(parent);
    }

    public void layoutContainer(final Container parent) {
        Insets insets = parent.getInsets();
        if (insets == null) {
            insets = new Insets(0, 0, 0, 0);
        }
        int a = insets.left;
        int b = insets.top;
        for (int i = 0; i < components.size(); i++) {
            Component c = (Component) components.get(i);
            if (c == null) {
                continue;
            }
            Rectangle bounds = getPreferredBounds(c);
            bounds.x += a;
            bounds.y += b;
            c.setBounds(bounds);
        }
    }

    public float getLayoutAlignmentY(final Container target) {
        return 0.5f;
    }

    public float getLayoutAlignmentX(final Container target) {
        return 0.5f;
    }

    public void invalidateLayout(final Container parent) {
        parent.repaint();
    }

    public static Rectangle getPreferredBounds(final Component c) {
        if (c == null) {
            return new Rectangle();
        }
        Point corner = c.getLocation();
        Rectangle bounds = c.getBounds();
        bounds.x = corner.x;
        bounds.y = corner.y;
        Dimension d;
        Dimension e;
        if (c instanceof Container) {
            Container x = (Container) c;
            d = x.getPreferredSize();
            bounds.width = d.width;
            bounds.height = d.height;
        } else {
            d = c.getMinimumSize();
            e = c.getSize();
            bounds.width = Math.max(d.width, e.width);
            bounds.height = Math.max(d.height, e.height);
        }
        return bounds;
    }
}
Mehr über Layoutmanager finden wir hier:
http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html
 

slawaweis

Bekanntes Mitglied
Ich bin jetzt schon mehrfach über ein Verhalten von Java gestolpert: wenn man bei einer Komponente setLayout(null) macht und dann die Position nicht mit setBounds() u. ä. angibt, wird sie nicht angezeigt. Das Verhalten find ich gaga, ich würde erwarten, dass es entweder eine Fehlermeldung gibt oder die Komponente mit Standardwerten angezeigt wird. So kann ja fröhliches Bugsuchen beginnen - die Komponente könnte ja ebenso gut nicht angezeigt werden, weil man irgendwo eine falsche Kondition drin hat usw. usf.

Fast noch schlimmer als (null), wie seht ihr das?
vorsichtig mit dem "gaga". Nur weil etwas nicht deinen Vorstellungen entspricht, muss es nicht gleich falsch sein. Per Default haben die Componenten die Ausmaße (0,0,0,0). Einige haben zwar PreferredSize gesetzt, aber das wird nur von LayoutManagern beachtet, die dann mit setSize die Endgröße bestimmen. Manchmal ist es erwünscht, dass aktive bzw. hinzugefügte Componenten die Ausmaße (X,Y,0,0) annehmen können, wenn diese z.B. temporär geschrumpft werden oder per Animation die Größe ändern. Ein Beispiel wäre JSplitPane, wo man eine Seite auf 100% vergrößern können soll. So wäre es eher falsch, wenn AWT/Swing für alle Sachen eine Mindestgröße vorgeben oder Exceptions werfen würde, den dann könnte man vielleicht nicht die gewünscht Funktionalität umsetzen.

Das man vielleicht wegen solchen Verhaltens Fehler nicht gleich merkt, ist eine Sache der Übung. Erstens sollte man fast immer einen LayoutManager verwenden, auch wenn man für seine Funktionalität selber einen schreiben muss. Wenn man keinen LayoutManager verwendet, sollte es schon seine Gründe haben und dann muss man sich damit gut auskennen. Ich hatte, nach dem ich AWT/Swing gelernt habe, damit jedenfalls keine Probleme gehabt. Irgendwann entwickelt man ein Gefühl woran es liegt, wenn der Bildschirm nicht so aussieht, wie geplant.

Slawa
 
Zuletzt bearbeitet:

marasek

Aktives Mitglied
Tja, wie soll ich sagen - den Faktor "Übung" versuche ich in meinen eigenen Sachen soweit als möglich auszuklammern. Ich habe früher mit Funktionen, Globalen und Arrays, die einer bestimmten Konvention folgen, programmiert. Das kann man recht gut kontrollieren, man hat ja Übung. Aber nicht zwei Jahre später, wenn man mal was abändern muss.

Ich bin da strikt - ganz oder gar nicht. Insofern finde ich es auch von Übel, dass man in Java straffrei jede Variable mit null befüllen kann.
 

Ebenius

Top Contributor
Man kann sich aber auch -- anstatt sich zu beschweren -- mal mit Komponentenlayout in AWT/Swing auseinandersetzen. Außerdem hilft es schon, keine null-Layouts zu verwenden. Nicht umsonst wird null-Layout in jeder vernünftigen Quelle als absolute Ausnahme gehandhabt. Informationen zum Komponentlayout gibt's zum Beispiel im Sun Java Tutorial » Lesson: Laying Out Components Within a Container. Deine Erwartungen oben sind im übrigen weder durchdacht noch zweckführend.

EDIT: Huch, André Uhres hat schon sehr interessante Sachen oben geschrieben und wird vom Eingangsschreiberling sträflich misachtet... Dann hätte ich mir ja meinen Beitrag sparen können...

Ebenius
 

marasek

Aktives Mitglied
Man kann sich aber auch -- anstatt sich zu beschweren -- mal mit Komponentenlayout in AWT/Swing auseinandersetzen. Außerdem hilft es schon, keine null-Layouts zu verwenden. Nicht umsonst wird null-Layout in jeder vernünftigen Quelle als absolute Ausnahme gehandhabt. Informationen zum Komponentlayout gibt's zum Beispiel im Sun Java Tutorial » Lesson: Laying Out Components Within a Container. Deine Erwartungen oben sind im übrigen weder durchdacht noch zweckführend.

Ich habe eine Ansicht geäussert und um Kommentare gebeten und mich nicht nur einfach beschwert.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
morphesus Swing Komponenten werden nicht angezeigt AWT, Swing, JavaFX & SWT 8
T Komponenten im JDialog werden nicht erneut gerendert AWT, Swing, JavaFX & SWT 9
G GridBagLayout - Komponenten werden nicht angezeigt AWT, Swing, JavaFX & SWT 6
A Gui Komponenten werden nicht von selbst aktualisiert! AWT, Swing, JavaFX & SWT 2
G GUI-Komponenten werden nicht angezeigt AWT, Swing, JavaFX & SWT 3
G Nicht alle Komponenten werden angezeigt AWT, Swing, JavaFX & SWT 8
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
D JavaFX GUI Komponenten werden langsam bei größerer Datenmenge AWT, Swing, JavaFX & SWT 6
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
JuliaOne Komponenten innerhalb eine JScrollpane werden auch ausserhalb davon gezeichnet! AWT, Swing, JavaFX & SWT 7
xehpuk Swing Komponenten werden durch setFont() winzig AWT, Swing, JavaFX & SWT 3
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
BabySuna Swing Komponenten auslagern auf separate Datei AWT, Swing, JavaFX & SWT 8
P AWT Einzelne Komponenten zur Laufzeit austauschen? AWT, Swing, JavaFX & SWT 3
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
F Gebundene Eigenschaften bei Komponenten mit NetBeans verarbeiten AWT, Swing, JavaFX & SWT 3
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
P Gleichmäßige Anodnung von Komponenten im migLayout AWT, Swing, JavaFX & SWT 2
DaCrazyJavaExpert Swing Komponenten genauer anordnen. AWT, Swing, JavaFX & SWT 13
P Größe und Ausrichtung von Komponenten festlegen AWT, Swing, JavaFX & SWT 13
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
Neumi5694 LookAndFeel Look & Feel nicht angezeigter Komponenten ändern AWT, Swing, JavaFX & SWT 6
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX Welche Komponenten vermisst ihr? Welche wären essenziell notwendig? AWT, Swing, JavaFX & SWT 8
M Datei mit Komponenten einbinden AWT, Swing, JavaFX & SWT 7
T SWT Externer zugrif auf SWT Komponenten AWT, Swing, JavaFX & SWT 3
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
J MouseOver bei Komponenten AWT, Swing, JavaFX & SWT 9
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
G Komponenten vergrößern sich nicht trotz Layoutmanager AWT, Swing, JavaFX & SWT 24
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
S BoxLayout: Anordnung der Komponenten links statt zentriert AWT, Swing, JavaFX & SWT 0
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
G Applet Applet Komponenten flackern AWT, Swing, JavaFX & SWT 10
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
M Komponenten übereinander AWT, Swing, JavaFX & SWT 7
H Swing Getter für GUI-Komponenten AWT, Swing, JavaFX & SWT 3
B Komponenten in Fenster verdrängen sich untereinander AWT, Swing, JavaFX & SWT 6
N Komponenten übereinander AWT, Swing, JavaFX & SWT 3
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
M Swing Komponenten enablen? AWT, Swing, JavaFX & SWT 4
X Java Komponenten jeder Zeit hinzufügen können AWT, Swing, JavaFX & SWT 3
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
D Grafische Komponenten komplett neu aufbauen (Neukonstruktion) AWT, Swing, JavaFX & SWT 5
A AWT Komponenten in JavaFX einbetten AWT, Swing, JavaFX & SWT 9
M Swing Komponenten erscheinen beim darüberfahren? AWT, Swing, JavaFX & SWT 7
H Komponenten unmittelbar nach dem Ausführen teilweise unsichtbar AWT, Swing, JavaFX & SWT 3
K GUI in Komponenten aufteilen (MVC) AWT, Swing, JavaFX & SWT 2
W Funktionen, sowie aufruf einiger Komponenten AWT, Swing, JavaFX & SWT 4
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
T Unter JPanel liegende Komponenten "totschalten" AWT, Swing, JavaFX & SWT 5
C Swing Reihenfolge der Initialisierung von Komponenten AWT, Swing, JavaFX & SWT 6
Asamandra LayoutManager GridBagLayout - Komponenten (mit fill?) vergrößern aber Proportionen dabei erhalten? AWT, Swing, JavaFX & SWT 3
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 7
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 2
W Bildgröße automatisch an Komponenten anpassen AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing Komponenten organisieren AWT, Swing, JavaFX & SWT 9
S Überlappung zweier Komponenten AWT, Swing, JavaFX & SWT 12
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
C GUI-Komponenten skalieren AWT, Swing, JavaFX & SWT 10
M Seltsames Problem mit Resize eines Fensters und seiner Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Komponenten verstecken AWT, Swing, JavaFX & SWT 4
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
T Swing Font für alle Komponenten ändern AWT, Swing, JavaFX & SWT 2
S Problem mit Swing Komponenten AWT, Swing, JavaFX & SWT 11
A Swing Alle Komponenten auf JFrame ermitteln AWT, Swing, JavaFX & SWT 4
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
M Komponenten übereinander prüfen AWT, Swing, JavaFX & SWT 3
W LayoutManager GridBag richtig nutzen - Komponenten richtig anordnen und automatisch vergrößern AWT, Swing, JavaFX & SWT 5
M Komponenten in anderer Reihenfolge anzeigen AWT, Swing, JavaFX & SWT 4
G swing Komponenten verrutschen ständig... AWT, Swing, JavaFX & SWT 6
D Mit GridBayLayout Komponenten anordnen AWT, Swing, JavaFX & SWT 6
N Window transparent, Komponenten nicht transparent AWT, Swing, JavaFX & SWT 11
R Farbänderung von Komponenten wird nicht wirksam AWT, Swing, JavaFX & SWT 7
P Swing Hierachie oder Reihenfolge von Komponenten AWT, Swing, JavaFX & SWT 5
T Sich überlappende Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Probleme beim Anzeigen der einzelnen Komponenten AWT, Swing, JavaFX & SWT 16
R Swing Komponenten klein angezeigt AWT, Swing, JavaFX & SWT 10
D Swing Swing Komponenten verschieben AWT, Swing, JavaFX & SWT 7
B Komponenten nach Skalierung nicht mehr ansprechbar AWT, Swing, JavaFX & SWT 9
Kr0e AWT Komponenten in JPanel AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben