我正面临一个非常讨厌的问题,我想知道是否有人知道如何处理它。我有一个Eclipse RCP e4应用程序,它根据文件的内容创建动态部分。
对于每个文件,创建的部分必须并排显示两个表(实现为NatTables),这两个表必须是水平可调整大小的(例如,主 - 细节)
当我开始时,我认为一个好方法是使用动态复合部件,它既不能作为部件描述符添加,也不能作为应用程序模型中的片段添加。根据我的理解,复合部分的目的也是处理这种情况,但我找不到动态使用它们的方法。
为了使某些工作正常,我转而使用此代码,该代码通过向SWT.Resize事件添加侦听器来基于常量重绘两个表。虽然,这段代码并不完全符合我的要求。
public void postConstruct(Composite parent,EMenuService menuService){
...
Shell shell = parent.getShell();
Point size = shell.getSize();
leftGridData.widthHint = (int)(size.x * leftProportion);
rightGridData.widthHint = size.x - leftGridData.widthHint;
// adding this configuration adds the styles and the painters to use
_tableViewLeft.setLayoutData(leftGridData);
_tableView.setLayoutData(rightGridData);
_tableView.configure();
// Tooltip for row/column headings
shell.addListener(SWT.Resize, new Listener()
{
@Override
public void handleEvent(Event arg0)
{
Point size = shell.getSize();
leftGridData.widthHint = (int) (size.x * leftProportion);
rightGridData.widthHint = size.x - leftGridData.widthHint;
shell.redraw();
}
});
}
我想要实现的是能够在动态部分内水平调整两个表的大小。这两个表应使用所有空间来适应可用空间。任何提示或建议都会非常感激。
对于GridLayout,您需要做的就是为两个控件的布局数据指定'SWT.FILL'和'抓取额外空间'。无需倾听调整大小。
GridLayout layout = new GridLayout(2, true);
composite.setLayout(layout);
...
GridData leftGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
leftControl.setLayoutData(leftGridData);
...
GridData rightGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
rightControl.setLayoutData(rightGridData);
如果您希望能够手动调整间距,请查看Sash
和SashForm
控件。
虽然NatTable尊重SWT布局(正如@ greg-449建议的那样,我也建议作为正确的解决方案),但默认情况下,NatTable实例中的列不会调整大小以占用所有可用空间。除非您以不同方式配置,否则列宽具有固定大小。因此,一旦修复了SWT布局问题,您还需要配置NatTable以确定百分比大小,这意味着根据可用的容器宽度计算列宽。这可以通过DataLayer#setColumnPercentageSizing(boolean)
完成