java - widgets - swt text




Empêcher SWT ScrolledComposite de manger une partie de ses enfants (3)

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 il clipse le dernier bouton:

bigbrother82: Cela n'a pas fonctionné.

SCdF: J'ai essayé votre suggestion, et maintenant les barres de défilement sont parties. Je dois travailler un peu plus là-dessus.


C'est un obstacle commun lors de l'utilisation de ScrolledComposite . Quand il devient si petit que la barre de défilement doit être affichée, le contrôle client doit rétrécir horizontalement pour faire de la place pour la barre de défilement. Cela a pour effet secondaire de créer des lignes d'habillage d'étiquettes, 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 composite de contenu ( mParent ), calculer à nouveau la hauteur minimale compte tenu de la nouvelle largeur du contenu et appeler setMinHeight() sur le composite setMinHeight() 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 modifications de la hauteur du contenu n'affectent pas la hauteur minimale du contenu, tant que la largeur est la même.


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


Vous n'avez pas besoin de recalculer la taille de la scrollBox après la mise en page?