Domanda

Che cosa ho fatto di sbagliato?

Ecco un estratto dal mio codice:

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));
}

...ma blocca l'ultimo pulsante:alt text

fratello maggiore82:Non ha funzionato.

SCdF:Ho provato il tuo suggerimento e ora le barre di scorrimento sono scomparse.Devo lavorarci ancora un po' su questo.

È stato utile?

Soluzione

Questo è un ostacolo comune durante l'utilizzo ScrolledComposite.Quando diventa così piccolo che è necessario mostrare la barra di scorrimento, il controllo client deve ridursi orizzontalmente per fare spazio alla barra di scorrimento.Ciò ha l'effetto collaterale di far sì che alcune etichette avvolgano le linee, spostando i controlli successivi più in basso, aumentando così l'altezza minima necessaria per il contenuto composito.

È necessario prestare attenzione alle modifiche della larghezza nel contenuto composito (mParent), calcola nuovamente l'altezza minima data la nuova larghezza del contenuto e chiama setMinHeight() sul composito a scorrimento con nuova altezza.

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);
}

Nell'ascoltare le modifiche alle dimensioni, tieni presente che ignoriamo qualsiasi evento di ridimensionamento in cui la larghezza rimane la stessa.Questo perché le modifiche all'altezza del contenuto non influiscono sul minimo altezza del contenuto, purché la larghezza sia la stessa.

Altri suggerimenti

Se non sbaglio devi scambiare il file

mParent.layout();

E

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

in modo da avere:

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();
}

Non è necessario ricalcolare la dimensione dello scrollBox dopo il layout?

Prova a impostare .setMinWidth e .setMinHeight sullo ScrolledComposite una volta terminato il layout, passandogli la dimensione del composito principale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top