gpt4 book ai didi

java - 尝试创建包含两个 TableViewer 的 org.eclipse.swt.widgets.Composite 时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:43:13 25 4
gpt4 key购买 nike

我的任务是创建一个包含两个 TableViewer 的 Composite。顶部表格包含单行可编辑单元格。这些表格单元格将用于过滤底部表格中的数据。有很多事情不能正常工作,但我将在这里限制我的询问,特别是其中之一。 TableViewers 的表格超出了包含它们的 Composite 的宽度和高度,并且我无法查看超出 Composite 右边缘(或底部表格中延伸到底部下方的行)的表格列。复合 Material 的水平滚动条可以正确滚动,但只能滚动到复合 Material 的宽度(毫不奇怪)。我确信这就像在构建过程中调整 GridData 或 SWT 常量一样简单。可悲的是,我尝试了几种不同的组合但没有成功。这是我的相关代码片段:

public class ControlledColumnFilterTableComposite<T> extends Composite {
private TableViewer filterViewer;
private TableViewer mainViewer;
public ControlledColumnFilterTableComposite(Composite parent,
IControlledColumnTableContentProvider<T> content) {
super(parent, SWT.H_SCROLL);
createComposite(parent, content);
}
private void createComposite(Composite parent,
IControlledColumnTableContentProvider<T> content) {
this.setLayout(new GridLayout(1, false));
GridData data = getLayoutData(parent);
this.setLayoutData(data);
addHorizontalBarListener();
this.filterViewer = createFilterViewer(parent, content);
this.mainViewer = createMainViewer(parent, content);
}
private TableViewer createFilterViewer(Composite parent,
IControlledColumnTableContentProvider<T> content) {
TableViewer viewer = new TableViewer(this, SWT.MULTI
| SWT.FULL_SELECTION | SWT.BORDER);
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setLinesVisible(true);
viewer.setContentProvider(content);
ControlledColumnTableMetadata<T> metadata = content.getMetadata();
for (int i = 0; i < metadata.getBean().getDeclaredFields().length; i++) {
getViewerColumn(viewer, metadata.getBean().getDeclaredFields()[i],
true);
}
return viewer;
}
private TableViewer createMainViewer(Composite parent,
IControlledColumnTableContentProvider<T> content) {
TableViewer viewer = new TableViewer(this, SWT.MULTI | SWT.V_SCROLL
| SWT.FULL_SELECTION | SWT.BORDER);
viewer.getTable().setHeaderVisible(false);
viewer.getTable().setLinesVisible(true);
viewer.setContentProvider(content);
viewer.setInput(((IPagingContentProvider<T>) content)
.getModelProvider().getTableRows());
ControlledColumnTableMetadata<T> metadata = content.getMetadata();
for (int i = 0; i < metadata.getBean().getDeclaredFields().length; i++) {
getViewerColumn(viewer, metadata.getBean().getDeclaredFields()[i],
false);
}
viewer.getTable().setLayoutData(getLayoutData(parent));
/*
* I've tried getLayoutData(this) and I've also tried manipulating the
* grabExcessHorizontalSpace and grabExcessVerticalSpace on the returned
* GridData without getting the desired results
*/
return viewer;
}
private TableViewerColumn getViewerColumn(TableViewer viewer, Field field,
boolean listen) {
final TableViewerColumn viewerColumn = new TableViewerColumn(viewer,
SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
setColumnProperties(viewer, column, field);
viewerColumn.setLabelProvider(getColumnLabelProvider(field));
// Only the filter TableViewer should have Listeners and EditingSupport
if (listen) {
// add sorting support
viewerColumn.getColumn().addListener(SWT.Selection,
new SortListener(field));
// add support for saving column width preferences
viewerColumn.getColumn()
.addControlListener(createControlListener());
// add editing support
viewerColumn.setEditingSupport(getEditingSupport(viewer, field));
}
return viewerColumn;
}
private void setColumnProperties(TableViewer viewer, TableColumn column,
Field field) {
ControlledColumnTableMetadata<T> metadata = ((IControlledColumnTableContentProvider<T>) viewer
.getContentProvider()).getMetadata();
column.setText(metadata.getColumnHeader(field));
column.setToolTipText(metadata.getColumnHeader(field));
if (metadata.isVisible(field)) {
column.setWidth(metadata.getColumnWidth(field));
column.setResizable(true);
column.setMoveable(true);
} else {
column.setWidth(0);
column.setResizable(false);
column.setMoveable(false);
}
}
private GridData getLayoutData(Composite parent) {
GridLayout layout = (GridLayout) parent.getLayout();
// Layout the viewer
GridData gridData = new GridData();
gridData.verticalAlignment = GridData.FILL;
gridData.horizontalAlignment = GridData.FILL;
gridData.horizontalSpan = layout.numColumns;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
return gridData;
}
...
}

非常感谢任何建议。提前致谢。

最佳答案

  1. 不要这样做

    GridData data = getLayoutData(parent); // inside getLayoutData: GridLayout layout = (GridLayout) parent.getLayout();
    this.setLayoutData(data);

    setLayout 应该由组合使用来安排子控件(this.setlayout)。与 this.someControl.setLayoutData() 相同。在您的情况下:父句柄控制 ControlledColumnFilterTableComposite 的放置位置,ControlledColumnFilterTableComposite 处理 TableViewer 的排列方式。这意味着您永远不应该调用:parent.getLayout() 和 this.setLayoutData(),因为您可能不知道 Layout 父级使用哪个布局,并且使用无效的 LayoutData 会导致一些异常。

  2. 试试这个

    this.setLayout(new GridLayout(1,false));
    this.filterViewer = createFilterViewer();
    this.filterViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,true));

    this.mainViewer = createMainViewer();
    this.mainViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,true));

    GridLayout 在 HTML 中用作表格 - 将控件放置在单元格中。 SWT.FILL 表示控件将水平和垂直填充周围的单元格,true(第三个和第四个参数)表示单元格将水平和垂直扩展至最大可用大小

  3. 删除 H_SCROLL,如果您想在复合 Material 中滚动,请使用 ScrolledComposite

关于java - 尝试创建包含两个 TableViewer 的 org.eclipse.swt.widgets.Composite 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4854417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com