【问题标题】:How to display a composite on the top of another composite which contains a table viewer?如何在包含表格查看器的另一个复合材料的顶部显示复合材料?
【发布时间】:2020-06-27 02:22:40
【问题描述】:

Wizard页面的createControl(parent)方法中,代码如下-

    top = new Composite(parent, SWT.NONE);
    top.setLayout(new FillLayout());
    setControl(top);
    setPageComplete(false);
    createViewer(top);

我想在top 表示的复合体上方添加一个row

它不允许我。如果我添加它,由top 表示的composite 会丢失。

下面是为顶部合成渲染的-

当我将下面的代码放在top 组合之前,top 组合就会丢失-

    upper = new Composite(parent, SWT.NONE);
    upper.setLayout(new FillLayout());
    setControl(upper);
    Label label = new Label(page, SWT.NONE);
    label.setText("Some text to disply");

请就如何实现这一点提出建议。


以下是我的createControl sn-p。如果添加一行,它会破坏表格查看器的滚动和大小。

@Override
public void createControl(Composite parent) {

    /*top = new Composite(parent, SWT.NONE);
    top.setLayout(new FillLayout());
    setControl(top);*/
    setPageComplete(false);

    top = new Composite(parent, SWT.NONE);
    top.setLayout(new GridLayout());
    setControl(top);

    Label label = new Label(top, SWT.NONE);
    label.setText("Some text to disply");
    label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));


    createViewer(top);
}

private void createViewer(Composite parent) {

    tableLayout = new TableColumnLayout();

    // A separate composite containing just the table viewer is required
    Composite tableComp = new Composite(parent, SWT.NONE);

    tableComp.setLayout(tableLayout);
    viewer = new TableViewer(tableComp, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    createColumns(parent, viewer);
    final Table table = viewer.getTable();
    table.setHeaderVisible(true);
    table.setLinesVisible(true);

    viewer.setContentProvider(new ArrayContentProvider());

    // Layout the viewer
    GridData gridData = new GridData();
    gridData.verticalAlignment = GridData.FILL;
    gridData.horizontalSpan = 2;
    gridData.grabExcessHorizontalSpace = true;
    gridData.grabExcessVerticalSpace = true;
    gridData.horizontalAlignment = GridData.FILL;
    viewer.getControl().setLayoutData(gridData);
}

public TableViewer getViewer() {
    return viewer;
}


// This will create the columns for the table
    private void createColumns(final Composite parent, final TableViewer viewer) {
        String[] titles = { "Node Status", "Node Type", "Node Name" };
        int[] bounds = { 100, 100, 100 };
        Image HEADER = CommonUtility.HEADER;

        TableViewerColumn col = null;

        // First column is for type
        col = createTableViewerColumn(HEADER, titles[0], bounds[0], 0);
        col.setLabelProvider(new CentredImageCellLabelProvider() {

            @Override
            public Image getImage(Object element) {
                GenerateSkeletonComponentsStatusModel model = (GenerateSkeletonComponentsStatusModel) element;
                if (model.isNew()) {
                    return CommonUtility.CHECKED;
                } else {
                    return CommonUtility.UNCHECKED;
                } 
            }
        });
        // Weight for column
        tableLayout.setColumnData(col.getColumn(), new ColumnWeightData(50));

        // now the newly created
        col = createTableViewerColumn(HEADER, titles[1], bounds[1], 1);
        col.setLabelProvider(new CentredImageCellLabelProvider() {

            @Override
            public Image getImage(Object element) {
                GenerateSkeletonComponentsStatusModel model = (GenerateSkeletonComponentsStatusModel) element;
                if ("ns_flow".equals(model.getIcon())) {
                    return CommonUtility.FLOW_SERVICE;
                } 
                if ("ns_open_interface".equals(model.getIcon())) {
                    return CommonUtility.FOLDER;
                } 
                if ("ns_record".equals(model.getIcon())) {
                    return CommonUtility.DOCUMENT_TYPE;
                } 
                if ("ns_package".equals(model.getIcon())) {
                    return CommonUtility.PACKAGE;
                } 
                if("RestResource".equals(model.getIcon())){
                    return CommonUtility.RESTFUL_FOLDER;
                }
                return null;
            }

        });
        // Weight for column
        tableLayout.setColumnData(col.getColumn(), new ColumnWeightData(50));


        // First column is for the component name
        col = createTableViewerColumn(HEADER, titles[2], bounds[2], 2);
        col.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                GenerateSkeletonComponentsStatusModel model = (GenerateSkeletonComponentsStatusModel) element;
                return model.getComponentName();
            }
        });
        // Weight for column
        tableLayout.setColumnData(col.getColumn(), new ColumnWeightData(100));

    }

    private TableViewerColumn createTableViewerColumn(Image image, String title, int bound, final int colNumber) {
        final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.LEAD);
        final TableColumn column = viewerColumn.getColumn();
        column.setImage(image);
        column.setText(title);
        column.setWidth(bound);
        column.setResizable(true);
        column.setMoveable(true);
        column.setAlignment(SWT.CENTER);
        return viewerColumn;

    }

【问题讨论】:

  • @greg-449:我想在表格查看器下方或上方显示一些文本。有什么办法吗?
  • 您只需将多个控件添加到顶级组合。这可能包括嵌套复合材料。您可能需要使用不同的布局 - 例如 GridLayout。

标签: java eclipse eclipse-plugin swt jface


【解决方案1】:

一个向导页面只能有一个顶级组合。您可以向该组合添加多个控件(包括嵌套组合)。

所以对于表格上面的标签:

top = new Composite(parent, SWT.NONE);
top.setLayout(new GridLayout());
setControl(top);

Label label = new Label(top, SWT.NONE);
label.setText("Some text to disply");
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));

TableViewer viewer = new TableViewer(top, .... flags
viewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

【讨论】:

  • 它仍然中断。表格查看器的滚动消失。我已经附上了相同的代码sn-p。
  • 您显示的代码不会尝试在表格上方放置标签 - 那么它与答案有什么关系?
  • 您需要在tableComp 上设置 GridData,查看器控件不应该有 GridData,因为 TableColumnLayout 处理它。 tableComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
  • 那么TableColumnLayout 和对setColumnData 的调用将无用,我的整个表格也不会显示。我已经在问题中添加了代码。
  • 事实并非如此。 tableComp.setLayoutData 设置由tableComp 的父组合使用的布局数据。 TableColumnLayout 对 tableComp 的子元素进行布局。
猜你喜欢
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多