IWizardPage 的动态内容未正确显示

Dynamic content of IWizardPage not properly shown

我正在开发一个 Eclipse 产品,它将打开一个向导,其内容取决于之前的用户选择。我创建了一些读取全局参数然后显示适当内容的 WizardPages。

但我正在为最新的页面苦苦挣扎,该页面应该显示一个 table,其中包含任意数量的列和任意数量的行。

因为 table 的内容取决于用户在之前页面上的输入,所以页面的创建没有在 public void createControl(Composite parent) 中完成。在此函数中,我创建了一个全局 composite,它将承载 table,该 table 在页面可见时创建,因为此时所需的信息可用。

列数和标题取决于用户输入,就像行数一样。

我添加了一个示例,其中 table 应该有 3 列和 ~15 行。除了最后一列的单元格外,每个单元格都包含一个复选框。最后一列的单元格包含文本。但是正如您所看到的,WizardPage 的大部分是灰色的,并且在底部有一个小区域,您可以在其中看到 table。它看起来像有某种覆盖。此外,整个 table 看起来像是向左移动,因为您在示例图片上只能看到两列。

如果我将所有内容添加到 ScrolledComposite 中,即使是很小的区域也不可见。 (稍后我将更改为 ScrolledComposite,因为 table 会变得非常大。)我调试了项目,我可以看到页面已正确构建并且复合 composite 仅托管 table没有其他元素。所有列标题和创建的行数都是正确的,但我无法正确显示 table。

我很感谢你的每一个建议。

代码如下:

public class selectionListPage extends CoevolutionDecisionPage implements SelectionListener {

    private ScrolledComposite scrolledComposite;
    private Composite composite;
    private Table table;

    private HashMap<String, String> parameters;

    public selectionListPage(String name, HashMap<String, String> parameters) {
        super(name);
        this.setTitle(name);
        this.parameters = parameters;
    }

    @Override
    public void createControl(Composite parent) {
        composite = new Composite(parent, SWT.NULL);
        composite.setLayout(new GridLayout());
        setControl(composite);
    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (visible) {
            onEnterPage();
        }
    }

    public void onEnterPage() {
        CoevolutionWizard wizard = (CoevolutionWizard)getWizard();
        // this list will contain all titles for all columns
        ArrayList<String> titles = new ArrayList<String> ();
        /* read titles from wizard */
        // create table for data
        table = new Table(composite, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
        table.setLinesVisible (true);
        table.setHeaderVisible (true);
        table.setVisible(true);
        // set layout data so that all cells are equal
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        table.setLayoutData(data);
        for (int i = 0; i < titles.size(); i++) {
            TableColumn column = new TableColumn (table, SWT.NONE);
            column.setText (titles.get(i));
        }
        // add table column for attributes
        TableColumn column = new TableColumn (table, SWT.NONE);
        column.setText ("Attribute");
        // this list will contain all relevant elements for all inspected elements
        ArrayList<ArrayList<String>> allElements = new ArrayList<ArrayList<String>> ();
        /* read data from wizard */
        // this counter indicates which column is default value for items
        int elementCount = 0;
        // every element has an own element of nested elements
        for (ArrayList<String> list : allElements) {
            // iterate over all nested elements
            for (String element : list) {
                // each row has one tableItem which contains all cells and meta data about items
                TableItem item = new TableItem (table, SWT.NONE);
                // for every column a cell will be created
                for (int j = 0; j < titles.size()-1; j++) {
                    // create a checkbutton
                    Button checkButton = new Button(table, SWT.CHECK);
                    TableEditor editor = new TableEditor(table);
                    // pack button for correct display size and set listener
                    checkButton.pack();
                    checkButton.addSelectionListener(this);
                    // set size and alignment options for this cell
                    editor.minimumWidth = checkButton.getSize().x;
                    editor.horizontalAlignment = SWT.CENTER;
                    // add button to meta data of table item
                    item.setData("checkButton" + j, checkButton);
                    // add element to table
                    editor.setEditor(checkButton, item, j);
                }
                // add text
                item.setText (titles.size(), titles.get(titles.size()-1));
                // add additional meta data
                item.setData("name", titles.get(titles.size()-1));
                item.setData("default", titles.get(elementCount));
            }
            elementCount++;
        }
        for (int j = 0; j < titles.size(); j++) {
            table.getColumn(j).pack();
        }
        composite.pack();
        // proceeding from this page is possible at every moment
        this.setPageComplete(true);
    }

    @Override
    public void widgetSelected(SelectionEvent e) {
        System.out.println("click");
    }

编辑:添加了 CoevolutionDecisionPage 的代码

/**
 * Superclass for all decision pages of the refactoring wizard.
 */
public abstract class CoevolutionDecisionPage extends WizardPage {

    /**
     * Creates a decision page for the refactoring wizard.
     * 
     * @param refElem
     *            Refactoring element.
     * @param decision
     *            Decision to show
     */
    public CoevolutionDecisionPage(String name) {
        super(name);
        this.setPageComplete(false);
    }

    /**
     * Is called as soon as data to execute the query delivering elements to
     * decide is available. This is important because a decision can depend on
     * previous decisions.
     */
    abstract public void updateData();
}

Edit2:我没有解决问题,但我想我有一些解决方案的相关信息(至少我希望如此)。

一时沮丧,我将布局从 createControl(Composite parent) 内的复合 parent 更改为 FillLayout,然后向导被分成与我拥有的 WizardPages 一样多的 "columns" .每列都包含正确的 WizardPage 并在正确的时间显示它。所以 FillLayout 行为正确。但这当然不是一个长期的解决方案,但允许我处理其他任务。它允许我验证 table.

的正确创建

所以我在不起作用的页面之后添加了另一个 WizardPage。此页面仅包含一些标签(它是最后一页并显示摘要)。但是此页面显示了与我的 selectionListPage 相同的奇怪行为(如果 parent 布局未设置为 FillLayout):它是 "overlayed".

所以我认为问题出在前一页中。我总共有四个 WizardPages:

第一个页面的行为符合预期,但其他两个页面可能没有显示。

您需要更新复合布局,调用

composite.layout(true, true);

就在 onEnterPage 结束时调用 composite.pack() 之前。