Frage

Wann ist die bevorzugte Größe eines JPanel -Sets, wenn Sie sie nicht explizit einstellen?

Ich habe den folgenden Code:

private static class ScrollableJPanel extends JPanel implements Scrollable {
    @Override
    public Dimension getPreferredScrollableViewportSize() {
                 return getPreferredSize();
    }
            .
            .
            .
}

und dieser Code:

    myPanel = new ScrollableJPanel();
            // Add a bunch of controls to the panel.
    final JScrollPane scroll = new JScrollPane(myPanel);
    scroll.setAutoscrolls(true);
    scroll.setHorizontalScrollBarPolicy(
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

Die bevorzugte Größe von Mypanel zu der Zeit, die GetPreferredScrollableViewPortSize () genannt wird, wird jedoch als willkürlicher Wert (4225, 34) bezeichnet und vorabsieset = false.

Laut dem Java -Dokumentation, Dies ist eine vernünftige Möglichkeit, diese Methode zu definieren. Die tatsächliche Größe von Mypanel ist jedoch viel höher als 34 Pixel, sodass der View -Port viel zu klein ist.

Was mache ich hier falsch? Sollte ich die bevorzugte Größe von Mypanel explizit festlegen? Ich habe das versucht, aber ich möchte die tatsächliche Größe verwenden, die vom Layout -Manager bestimmt wird, und nicht nur eine Vermutung machen, die später überschrieben wird.

Beachten Sie, dass meine Frage nicht so ist, wie man eine genaue Größe für das JPanel festlegt. Ich möchte, dass der Layout -Manager das tut. Ich möchte auch nicht die bevorzugte Größe ausdrücklich festlegen. Ich dachte, das wurde auch vom Layout -Manager behandelt. Ich möchte wissen, warum der Layout -Manager keinen angemessenen Wert für die bevorzugte Größe selbst festlegt, damit ich eine angemessene bevorzugte CRORDSCABLEViewPortSize zurückgeben kann.

War es hilfreich?

Lösung

Die bevorzugte Größe eines JPanel basiert auf den Komponenten im Panel. Der Layout -Manager berechnet eine bevorzugte Größe des Panels, basierend auf der bevorzugten Größe der Elemente im Panel. Wenn einige dieser Dinge Panels sind, ist es eine rekursive Berechnung. Wenn im Panel keine Unterkomponenten vorhanden sind, muss die bevorzugte Größe explizit eingestellt werden.

Andere Tipps

In awt (und dann schwingen), Container.getPreferredSize() entweder:

  • Gibt die Größe explizit nach setPreferredSize(),
  • oder die von der berechnete Größe LayoutManager wenn setPreferredSize() wurde nicht explizit genannt

Daher was getPreferredSize() Rückgabe in hohem Maße davon abhängig davon LayoutManager Sie verwenden für Ihre ScrollableJPanel.

Beachten Sie das am meisten LayoutManagers wird verwenden getPreferredSize() auf alle direkten Kinder der Container worauf getPreferredSize() hieß. Dies ist ein rekursiver Prozess (wenn Kinder selbst Kinder haben) und können mehrere verschiedene beinhalten LayoutManagers.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top