未正确显示IWizardPage的动态内容

时间:2015-04-27 12:36:45

标签: java eclipse swt visibility wizard

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

但是我正在努力学习最新的页面,该页面应该显示一个包含任意行数和任意行数的表格。

由于表格的内容取决于之前页面上的用户输入,因此不会在public void createControl(Composite parent)中创建页面。在这个函数中,我创建了一个全局composite,它将托管在页面可见时创建的表,因为此时所需的信息是可用的。

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

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

enter image description here

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

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

以下代码:

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)内的复合父级更改为FillLayout,然后将向导分成多个相等的&#34;列&#34;因为我有WizardPages。每列包含正确的WizardPage并在适当的时间显示它。所以FillLayout行为正确。但当然这不是一个长期的解决方案,但允许我从事其他任务。它允许我验证表的正确创建。

所以我在页面无效后添加了另一个WizardPage。此页面仅包含许多标签(它是最后一页并显示摘要)。但是这个页面显示了同样奇怪的行为(如果父布局未设置为FillLayout),例如我的selectionListPage:它是&#34;重叠&#34;。

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

  • 欢迎页面,显示从&#34; global&#34;读取的一些信息(仅文本)。参数。
  • 用户必须在任意数量的文本字段中键入名称的页面(即时创建和删除,以便每时只出现一个空文本字段)
  • 描述的包含表格的selectionListPage。
  • 摘要页面。

页面的第一个表现与预期相似,但其他两个可能不会显示。

1 个答案:

答案 0 :(得分:1)

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

composite.layout(true, true);

composite.pack()结束时拨打onEnterPage之前。