簡體   English   中英

具有沖突GridLayout的嵌套SWT復合材料

[英]Nested SWT Composites with conflicting GridLayout

我是SWT的新手,正在嘗試創建包含多個嵌套Composite的頁面。 我在使用嵌套在其他布局類型的CompositeGridLayout遇到了問題。

這是一些簡化的模擬代碼,它們說明了我要完成的工作以及遇到的錯誤:

package layouts_test;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Composite;

public class LayoutsTest {

  public static void main(String[] args) {

    Display display = new Display();
    Shell shell = new Shell(display);

    // Composite that contains all nested Composites
    Composite pageComposite = new Composite(shell, SWT.NONE);
    final StackLayout stackLayout = new StackLayout();
    pageComposite.setLayout(stackLayout);

    // Construct some Composites to stack on the pageComposite
    Composite stackComposite1 = new Composite(pageComposite, SWT.NONE);
    stackComposite1.setLayout(new RowLayout(SWT.VERTICAL));
    Composite stackComposite2 = new Composite(pageComposite, SWT.NONE);
    stackComposite2.setLayout(new FillLayout());

    // Construct a grid composite to go into stackComposite1
    Composite gridComposite = new Composite(stackComposite1, SWT.NONE);
    gridComposite.setLayout(new GridLayout(3, true));
    gridComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    gridComposite.layout();

    // Arbitrarily set stackComposite1 on top
    stackLayout.topControl = stackComposite1;
    stackComposite1.layout();

    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }

    display.dispose();
    return;
  }

}

當我運行此代碼時,出現以下異常,抱怨當應使用RowData進行布局時, stackComposite1顯然正在使用GridData

Exception in thread "main" java.lang.ClassCastException: org.eclipse.swt.layout.GridData cannot be cast to org.eclipse.swt.layout.RowData
at org.eclipse.swt.layout.RowLayout.layoutVertical(RowLayout.java:367)
at org.eclipse.swt.layout.RowLayout.layout(RowLayout.java:239)
at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1291)
at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1277)
at org.eclipse.swt.widgets.Composite.layout(Composite.java:666)
at org.eclipse.swt.widgets.Composite.layout(Composite.java:624)
at org.eclipse.swt.widgets.Composite.layout(Composite.java:587)
at layouts_test.LayoutsTest.main(LayoutsTest.java:39)

如果將stackComposite1的布局類型stackComposite1FillLayoutstackComposite1收到類似的錯誤,抱怨使用GridData而不是FillData 但是,當我從代碼中完全刪除gridComposite時,它可以正常工作。

我覺得我在這里錯過了一些非常關鍵的事情。 據我了解,布局僅影響Composite自身中包含的UI元素進行排列的方式。 當我明確地將其完全設置為另一種布局類型時,為什么嵌套的gridComposite強制其父stackComposite1也使用GridData

你有:

Composite stackComposite1 = new Composite(pageComposite, SWT.NONE);
stackComposite1.setLayout(new RowLayout(SWT.VERTICAL));

所以stackComposite1使用RowLayout

然后您有:

Composite gridComposite = new Composite(stackComposite1, SWT.NONE);
gridComposite.setLayout(new GridLayout(3, true));
gridComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

問題行在這里是:

gridComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

setLayoutData設置的布局數據由父級 Composite布局使用-此處的父級是stackComposite1 ,它使用行布局而不是網格布局。 您應該在這里使用RowData

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM