我在这里的尝试基本上是热交换组件的程序运行时。如果用户按下按钮,则作为浏览器的控件变为文本控件。我使用控件指向浏览器,然后将其切换为指向Text控件(在非显示外壳上绘制的屏幕外)。但是,我遇到了一些问题。目前,当按下按钮时,浏览器消失,但没有任何东西出现在它的位置,直到shell被调整大小。没有出现,直到外壳的Java SWT文本控件调整
下面是相关的代码片段:
开关程序:
private void switchWindow(Control cont) {
bottomPointer.setParent(offDraw);
bottomPointer = cont;
bottomPointer.setParent(outer);
bottomPointer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
outer.redraw();
}
创建该对象的buttonListener:
class textSelectionListener implements SelectionListener {
public void widgetSelected(SelectionEvent event) {
Text bottomText = new Text(offDraw, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
gd.grabExcessVerticalSpace = true;
gd.grabExcessHorizontalSpace = true;
bottomText.setLayoutData(gd);
switchWindow(bottomText);
}
而且我调整大小的监听器:
outer.addListener (SWT.Resize, new Listener() {
//add resize listener to automatically resize both browsers
public void handleEvent (Event e) {
Rectangle clientArea = outer.getClientArea();
browser.setLayoutData(new GridData(clientArea.width, 3*clientArea.height/5));
bottomPointer.setLayoutData(new GridData(GridData.FILL_BOTH));
}
});
我已经尝试了一切来解决这种情况,但唯一有效的工作是调整shell的大小。
我可能要对这个可怕的错误,但是这是我的第一个重大项目,所以我刚开始的东西的窍门之一。
我不知道,你正在服用的正道与部件的这种热插拔。我会建议你创建你的两个控件(浏览器和文本),并把它放在一个带有StackLayout的Composite中。当你需要交换它们时,你可以配置StackLayout来显示其他组件,并调用Composite.layout()。这将足以热插拔它们,并且它是更干净的方式来做到这一点。一个缺点是两个控件的大小完全一样,除非调用Composite.getParent()。layout()来布局父级,这应该调整StackLayout子级的大小。 – 2011-06-03 08:10:44
@Danail 我实现了这一点,它比我的旧代码更干净。谢谢! – 2011-06-03 16:05:34