2011-06-03 58 views
1

我在这里的尝试基本上是热交换组件的程序运行时。如果用户按下按钮,则作为浏览器的控件变为文本控件。我使用控件指向浏览器,然后将其切换为指向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的大小。

我可能要对这个可怕的错误,但是这是我的第一个重大项目,所以我刚开始的东西的窍门之一。

+1

我不知道,你正在服用的正道与部件的这种热插拔。我会建议你创建你的两个控件(浏览器和文本),并把它放在一个带有StackLayout的Composite中。当你需要交换它们时,你可以配置StackLayout来显示其他组件,并调用Composite.layout()。这将足以热插拔它们,并且它是更干净的方式来做到这一点。一个缺点是两个控件的大小完全一样,除非调用Composite.getParent()。layout()来布局父级,这应该调整StackLayout子级的大小。 – 2011-06-03 08:10:44

+0

@Danail 我实现了这一点,它比我的旧代码更干净。谢谢! – 2011-06-03 16:05:34

回答