我正在乱搞SWT(对于一个PropertyPage),发现了一个小'bug'? 基本上,当我调整shell的大小以使其小于我的控件时,它会使scrollBar可见,这与预期的一样。虽然如果我调整控件的大小(当然它都是单个根的子控件),但不知何故,一个或多个父母不会更新更改,这会导致一些奇怪的行为。
当我的控件的大小增加时,它基本上会从shell中生长出来(不可见),而没有可见的Scrollbar。如果我调整shell的大小(小于初始大小),ScrollBar将变为可见,但仅限于初始大小而不是整个宽度。
当我的控件缩小尺寸时,它不会“打包”任何一个父级,这意味着我可以滚动到控制范围之外的空白。
也许值得一提的是,对我来说只有横向增长/缩小是一个问题,虽然我很确定垂直调整大小时会出现同样的问题
我的问题是,是否有解决方案/解决方法。我试过在各种父母和shell本身上调用Layout()
和pack()
,但没有成功。现在我知道属性页面的一个父母(PreferenceDialog#PageLayout
)使用了一个自定义(遗憾的私有)布局类型。也许这种行为来自这个实现?
编辑,根据要求提供MCVE
我假设有人知道如何为propertyPage设置,所以为了清楚起见,我只发布了createContents方法(覆盖org.eclipse.jface.preference.PreferencePage
),以及一些辅助方法/字段应该重新创建一个设置可以观察到这种行为。基本上可以使用隐藏/取消隐藏列,并确保在需要不同的初始childSize(以测试增长和收缩)时重新打开
// static so you can re-open a the property/preference page for different initial sizes.
private static boolean h1 = false;
private static boolean h2 = false;
private static boolean h3 = false;
private static boolean h4 = false;
private Composite root;
@Override
protected Control createContents(Composite parent)
{
// setup root
this.root = new Composite(parent, SWT.NONE);
this.root.setLayout(new GridLayout());
this.root.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false));
Table table = new Table(this.root, SWT.SINGLE | SWT.VIRTUAL | SWT.BORDER | SWT.FULL_SELECTION);
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false));
TableColumn c1 = new TableColumn(table, SWT.LEFT);
c1.setMoveable(true);
c1.setText("column 1");
this.updateColumn(c1, h1);
TableColumn c2 = new TableColumn(table, SWT.LEFT);
c2.setMoveable(true);
c2.setText("column 2");
this.updateColumn(c2, h2);
TableColumn c3 = new TableColumn(table, SWT.LEFT);
c3.setMoveable(true);
c3.setText("column 3");
this.updateColumn(c3, h3);
TableColumn c4 = new TableColumn(table, SWT.LEFT);
c4.setMoveable(true);
c4.setText("column 4");
this.updateColumn(c4, h4);
Button hide1 = new Button(this.root, SWT.PUSH);
hide1.setText("Hide column 1");
hide1.addListener(SWT.Selection, E -> {
this.updateColumn(c1, h1 = !h1);
this.resize();
});
Button hide2 = new Button(this.root, SWT.PUSH);
hide2.setText("Hide column 2");
hide2.addListener(SWT.Selection, E -> {
this.updateColumn(c2, h2 = !h2);
this.resize();
});
Button hide3 = new Button(this.root, SWT.NONE);
hide3.setText("Hide column 3");
hide3.addListener(SWT.Selection, E -> {
this.updateColumn(c3, h3 = !h3);
this.resize();
});
Button hide4 = new Button(this.root, SWT.PUSH);
hide4.setText("Hide column 4");
hide4.addListener(SWT.Selection, E -> {
this.updateColumn(c4, h4 = !h4);
this.resize();
});
for(int i = 0; i < 20; i++)
{
TableItem ti = new TableItem(table, SWT.NONE);
ti.setText(new String[] {"c1:" + i, "c2:" + i, "c3" + i, "c4" + i});
}
return root;
}
protected void updateColumn(TableColumn c, boolean hide)
{
if(hide)
{
c.setResizable(false);
c.setWidth(0);
}
else
{
c.setResizable(true);
c.setWidth(300);
}
}
protected void resize()
{
this.root.getDisplay().asyncExec(() -> this.root.getShell().layout(null, SWT.ALL | SWT.CHANGED));
}