我尝试创建自己的FieldEditor (因为我必须动态填充combobox值)。所以我的类扩展了'FieldEditor‘。我的首选项页面需要3个这样的字段,然后看起来像这样(第二,第三和第四个字段编辑器;‘选择内核’的)。

很明显,布局出了问题。所有字段都应该看起来像第三个字段-使用完整的空格。
@Override
protected void adjustForNumColumns(int numColumns) {
((GridData) c_top.getLayoutData()).horizontalSpan = numColumns;
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
/* Layout comments:
*
* component are sequentially filled into numColumns
* by default each component will use 1 column
* GridData can be set to use more that one columns
*/
GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false);
gd.horizontalSpan = numColumns;
c_top = parent;
c_top.setLayoutData(gd);
c_group = new Composite(c_top, SWT.BORDER);
GridLayout newgd = new GridLayout(2, false);
c_group.setLayout(newgd);
c_group.setLayoutData(gd);
// kernel spec combo
Label comboLabel = new Label(c_group, SWT.NONE);
comboLabel.setText("Select kernel");
gd = new GridData(SWT.LEFT, SWT.TOP, false, false);
gd.horizontalSpan = numColumns - 1;
comboLabel.setLayoutData(gd);
c_kernelCombo = new Combo(c_group, SWT.READ_ONLY);
gd = new GridData(SWT.FILL, SWT.TOP, true, false);
//gd.horizontalSpan = 1;
c_kernelCombo.setLayoutData(gd);
}我甚至尝试了一个不使用组的更简单的布局,但是我所有的字段编辑器只使用了网格的2个单元格(这看起来有点滑稽,因为其他字段编辑器给出了3列)。
我不知道如何修复它。有人能帮帮忙吗?
发布于 2019-06-25 21:28:19
您正在两个控件上设置相同的GridData (gd)实例-这是,不允许。必须为每个控件创建一个新的GridData。
在任何情况下,您都不应该在parent组合上设置布局数据-这不属于您的代码。
发布于 2019-06-26 15:38:51
我有一个解决方案,但我不知道它是否正确:
1)我犯了一个错误,使用相同的父项创建了该页面的所有FieldEditors,尽管文档说要使用getFieldEditorParent()为每个字段编辑器检索一个新的父项
2)我想,我误解了adjustForNumColumns(int numColumns)的意思。我认为,它应该适应受列数变化影响的控件的horizontalSpan。现在我的代码看起来像这样:
@Override
protected void adjustForNumColumns(int numColumns) {
((GridData) c_kernelCombo.getLayoutData()).horizontalSpan = numColumns-1;
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
// kernel spec combo
Label comboLabel = new Label(parent, SWT.NONE);
comboLabel.setText("Select kernel");
GridData gd = new GridData(SWT.LEFT, SWT.TOP, false, false);
gd.horizontalSpan = 1;
comboLabel.setLayoutData(gd);
c_kernelCombo = new Combo(parent, SWT.READ_ONLY);
gd = new GridData(SWT.FILL, SWT.TOP, true, false);
gd.horizontalSpan = numColumns - 1;
c_kernelCombo.setLayoutData(gd);
}https://stackoverflow.com/questions/56754998
复制相似问题