具有冲突的 GridLayout 的嵌套 SWT 复合材料
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;
}
}
当我 运行 这段代码时,我得到以下异常抱怨 stackComposite1
显然在使用 GridData
而它应该使用 RowData
进行布局:
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
的布局类型更改为 FillLayout
,我会收到类似的错误,抱怨使用 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
设置的布局数据被 parent 复合布局使用 - 这里的父级是 stackComposite1
,它使用行布局而不是网格布局.你应该在这里使用RowData
。
我是 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;
}
}
当我 运行 这段代码时,我得到以下异常抱怨 stackComposite1
显然在使用 GridData
而它应该使用 RowData
进行布局:
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
的布局类型更改为 FillLayout
,我会收到类似的错误,抱怨使用 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
设置的布局数据被 parent 复合布局使用 - 这里的父级是 stackComposite1
,它使用行布局而不是网格布局.你应该在这里使用RowData
。