Verhindern Sie, dass SWT ScrolledComposite einen Teil seiner untergeordneten Elemente frisst

StackOverflow https://stackoverflow.com/questions/35123

  •  09-06-2019
  •  | 
  •  

Frage

Was habe ich falsch gemacht?

Hier ist ein Auszug aus meinem Code:

public void createPartControl(Composite parent) {
  parent.setLayout(new FillLayout());
  ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
  scrollBox.setExpandHorizontal(true);
  mParent = new Composite(scrollBox, SWT.NONE);
  scrollBox.setContent(mParent);
  FormLayout layout = new FormLayout();
  mParent.setLayout(layout);
  // Adds a bunch of controls here
  mParent.layout();
  mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
}

...aber es schneidet den letzten Knopf ab:alt text

bigbrother82:Das hat nicht funktioniert.

SCdF:Ich habe Ihren Vorschlag ausprobiert und jetzt sind die Bildlaufleisten verschwunden.Daran muss ich noch etwas arbeiten.

War es hilfreich?

Lösung

Dies ist eine häufige Hürde bei der Verwendung ScrolledComposite.Wenn es so klein wird, dass die Bildlaufleiste angezeigt werden muss, muss das Client-Steuerelement horizontal verkleinert werden, um Platz für die Bildlaufleiste zu schaffen.Dies hat den Nebeneffekt, dass einige Beschriftungen Zeilen umbrechen, wodurch die folgenden Steuerelemente weiter nach unten verschoben werden, wodurch sich die für die Inhaltszusammensetzung erforderliche Mindesthöhe erhöht.

Sie müssen auf Breitenänderungen im Inhaltsverbund achten (mParent), berechnen Sie erneut die Mindesthöhe angesichts der neuen Inhaltsbreite und rufen Sie auf setMinHeight() auf dem gescrollten Verbundwerkstoff mit neuer Höhe.

public void createPartControl(Composite parent) {
  parent.setLayout(new FillLayout());
  ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
  scrollBox.setExpandHorizontal(true);
  scrollBox.setExpandVertical(true);

  // Using 0 here ensures the horizontal scroll bar will never appear.  If
  // you want the horizontal bar to appear at some threshold (say 100
  // pixels) then send that value instead.
  scrollBox.setMinWidth(0);

  mParent = new Composite(scrollBox, SWT.NONE);

  FormLayout layout = new FormLayout();
  mParent.setLayout(layout);

  // Adds a bunch of controls here

  mParent.addListener(SWT.Resize, new Listener() {
    int width = -1;
    public void handleEvent(Event e) {
      int newWidth = mParent.getSize().x;
      if (newWidth != width) {
        scrollBox.setMinHeight(mParent.computeSize(newWidth, SWT.DEFAULT).y);
        width = newWidth;
      }
    }
  }

  // Wait until here to set content pane.  This way the resize listener will
  // fire when the scrolled composite first resizes mParent, which in turn
  // computes the minimum height and calls setMinHeight()
  scrollBox.setContent(mParent);
}

Beachten Sie beim Warten auf Größenänderungen, dass wir alle Größenänderungsereignisse ignorieren, bei denen die Breite gleich bleibt.Dies liegt daran, dass Änderungen in der Höhe des Inhalts keinen Einfluss auf die haben Minimum Höhe des Inhalts, solange die Breite gleich ist.

Andere Tipps

Wenn ich mich nicht irre, müssen Sie das tauschen

mParent.layout();

Und

mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));

damit Sie haben:

public void createPartControl(Composite parent) {
  parent.setLayout(new FillLayout());
  ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
  scrollBox.setExpandHorizontal(true);
  mParent = new Composite(scrollBox, SWT.NONE);
  scrollBox.setContent(mParent);
  FormLayout layout = new FormLayout();
  mParent.setLayout(layout);
  // Adds a bunch of controls here
  mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
  mParent.layout();
}

Müssen Sie die Größe der scrollBox nach dem Layout nicht neu berechnen?

Versuchen Sie, .setMinWidth und .setMinHeight für ScrolledComposite festzulegen, sobald das Layout fertig ist, und übergeben Sie ihm die Größe des Hauptverbunds.

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