[英]Nested SWT Composites with conflicting GridLayout
我是SWT的新手,正在嘗試創建包含多個嵌套Composite
的頁面。 我在使用嵌套在其他布局類型的Composite
的GridLayout
遇到了問題。
這是一些簡化的模擬代碼,它們說明了我要完成的工作以及遇到的錯誤:
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
的布局類型stackComposite1
為FillLayout
, stackComposite1
收到類似的錯誤,抱怨使用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.