我正在开发一个Eclipse产品,它将打开一个向导,其内容取决于之前的用户选择。我创建了一些WizardPages,它们读取全局参数,然后显示相应的内容。
但是我正在努力学习最新的页面,该页面应该显示一个包含任意行数和任意行数的表格。
由于表格的内容取决于之前页面上的用户输入,因此不会在public void createControl(Composite parent)
中创建页面。在这个函数中,我创建了一个全局composite
,它将托管在页面可见时创建的表,因为此时所需的信息是可用的。
列的数量和标题取决于用户输入,就像行数一样。
我添加了一个示例,其中表应该有3列和~15行。除最后一列之外的每个单元格都包含一个复选框。最后一列的单元格包含文本。但正如您所看到的,大部分WizardPage都是灰色的,而在底部有一个小区域,您可以看到该表。看起来有某种叠加效果。此外,整个表看起来像是向左移动,因为你只能在示例图片上看到两列。
如果我在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:
页面的第一个表现与预期相似,但其他两个可能不会显示。
答案 0 :(得分:1)
您需要更新复合布局,调用
composite.layout(true, true);
在composite.pack()
结束时拨打onEnterPage
之前。