Daniel: Grössen von Swing-Komponenten

Hallo,

wenn ich bei Swing-Komponenten, der in einem LayoutManager platziert wird, die Grösse mit setSize() nicht explizit setze, erhalte ich bei der Abfrage mit getWidth()/getHeight() immer den Wert 0, obwohl der Komponent eine Grösse hat! Kann ich das umgehen und die Grösse trotzdem ermitteln?

Gruss Daniel

  1. Hallo,

    wenn ich bei Swing-Komponenten, der in einem LayoutManager platziert wird, die Grösse mit setSize() nicht explizit setze, erhalte ich bei der Abfrage mit getWidth()/getHeight() immer den Wert 0, obwohl der Komponent eine Grösse hat! Kann ich das umgehen und die Grösse trotzdem ermitteln?

    Die Methode getPreferredSize() gibt ein Dimension-Objekt mit Breite und Höhe der bevorzugten Komponent-Größe zurück. Das muss aber nicht die Größe sein, welche die Komponente dann durch den Layoutmanager zugewiesen bekommt. Je nach Layoutmanager kann diese Größe aber ermittelt werden. Das FlowLayout kann z.B. nur die PreferredSize nehmen, wenn keine Größe explizit angegeben ist. Das BorderLayout füllt mit den Komponenten allerdings die angegebenen Plätze North, East, South, West und Center aus.

    viele Grüße

    Axel

    1. Hallo Axel,

      naja, ich habe ein JFrame und in dem JFrame hats ein JPanel und in dem JPanel hats wieder ein JPanel mit einem GridBagLayout und darin wiederum ein JSplitPane. Von diesem JSplitPane wollte ich die DividerLocation setzen (ca. 80% des Fensters). Leider kenn ich in diesem Panel das Fensterobjekt nicht, also habe ich versucht die Grösse des JSplitPane zu ermitteln und den Divider zu setzen:

      splitPane.setDividerLocation(splitPane.getPreferredSize().getWidth()*0.8);

      Ergibt immer Fehler:

      java.lang.IllegalArgumentException: proportional location must be between 0.0 and 1.0.

      Gruss Daniel

      1. Hallo,

        splitPane.setDividerLocation(splitPane.getPreferredSize().getWidth()*0.8);

        Ergibt immer Fehler:

        java.lang.IllegalArgumentException: proportional location must be between 0.0 and 1.0.

        Dann muß wohl der Wert, den du da übergibst, zwischen 0.0 und 1.0 liegen, nä...
        Siehe auch die Doku unter:
        http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JSplitPane.html#setDividerLocation(double)

        Der übergeben Wert -- sei es nun ein Integer oder ein Double -- ist
        laut Doku als Prozentwert zu interpretieren. Bei einem Double-Wert
        entspricht 1.0 eben 100%. Damit wäre der Divider ganz rechts.
        Du kannst der Methode auch einen Integer übergeben, dann würde der
        Wert "100" dem Prozentwert "100" entsprechen, und somit der Slider
        wieder ganz rechts sein.

        In deinem Code-Schnipsel oben übergibst du einen Double-Wert. (Und
        dieser ist weit größer als 1.0.)

        Da ich annehme, daß du den linken Bereich 80% und dem rechten Bereich
        20% groß machen möchtest, würde wohl ein Wert von 0.8 deine Wünsche
        erfüllen.

        Übrigens Vorsicht.
        Bei setDividerLocation(double proportionalLocation) ist zu lesen:
        If the split pane is not correctly realized and on screen, this
        method will have no effect.

        Heißt: Du mußt erst das Fenster anzeigen lassen, in dem das SplitPane
        ist, bevor du die Divider-Location setzen kannst.

        Gruß
        Slyh