سؤال

أي خطأ ارتكبت؟

هنا مقتطف من الكود الخاص بي:

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

...ولكنه يقطع الزر الأخير:alt text

الأخ الأكبر82:هذا لم ينجح.

SCdF:لقد جربت اقتراحك، والآن اختفت أشرطة التمرير.أحتاج إلى العمل أكثر على ذلك.

هل كانت مفيدة؟

المحلول

هذه عقبة شائعة عند الاستخدام ScrolledComposite.عندما يصبح صغيرًا جدًا لدرجة أنه يجب إظهار شريط التمرير، يجب أن يتقلص عنصر تحكم العميل أفقيًا لإفساح المجال لشريط التمرير.وهذا له أثر جانبي يتمثل في جعل بعض التسميات تلتف حول الخطوط، مما يؤدي إلى نقل عناصر التحكم التالية إلى الأسفل، مما يؤدي إلى زيادة الحد الأدنى للارتفاع الذي يحتاجه مركب المحتوى.

تحتاج إلى الاستماع إلى تغييرات العرض على المحتوى المركب (mParent)، احسب الحد الأدنى للارتفاع مرة أخرى بالنظر إلى عرض المحتوى الجديد، ثم اتصل setMinHeight() على المركب الذي تم تمريره بارتفاع جديد.

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

عند الاستماع إلى تغييرات الحجم، لاحظ أننا نتجاهل أي أحداث تغيير حجم حيث يظل العرض كما هو.وذلك لأن التغييرات في ارتفاع المحتوى لا تؤثر على الحد الأدنى ارتفاع المحتوى، طالما أن العرض هو نفسه.

نصائح أخرى

إذا لم أكن مخطئا تحتاج إلى مبادلة

mParent.layout();

و

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

بحيث يكون لديك:

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

ألا تحتاج إلى إعادة حساب حجم مربع التمرير بعد التخطيط؟

حاول ضبط .setMinWidth و.setMinHeight على ScrolledComposite بمجرد الانتهاء من التخطيط، مع تمريره بحجم المركب الرئيسي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top