Question

Qu'ai-je fait de mal?

Voici un extrait de mon 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));
}

...mais ça coupe le dernier bouton :alt text

grand frère82 :Cela n'a pas fonctionné.

SCDF :J'ai essayé votre suggestion et maintenant les barres de défilement ont disparu.Je dois travailler encore un peu là-dessus.

Était-ce utile?

La solution

Il s'agit d'un obstacle courant lors de l'utilisation ScrolledComposite.Lorsqu'il devient si petit que la barre de défilement doit être affichée, le contrôle client doit se rétrécir horizontalement pour faire de la place à la barre de défilement.Cela a pour effet secondaire de faire en sorte que certaines étiquettes retournent à la ligne, ce qui a déplacé les contrôles suivants plus bas, ce qui a augmenté la hauteur minimale requise par le composite de contenu.

Vous devez écouter les changements de largeur sur le contenu composite (mParent), calculez à nouveau la hauteur minimale en fonction de la nouvelle largeur du contenu et appelez setMinHeight() sur le composite défilé avec une nouvelle hauteur.

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

En écoutant les changements de taille, notez que nous ignorons tous les événements de redimensionnement où la largeur reste la même.En effet, les changements de hauteur du contenu n'affectent pas la le minimum hauteur du contenu, à condition que la largeur soit la même.

Autres conseils

Si je ne me trompe pas, vous devez échanger le

mParent.layout();

et

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

pour que tu aies :

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

N'avez-vous pas besoin de recalculer la taille du scrollBox après la mise en page ?

Essayez de définir .setMinWidth et .setMinHeight sur ScrolledComposite une fois la mise en page terminée, en lui transmettant la taille du composite principal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top