SWT-如何动态更改文本框的大小

SWT-如何动态更改文本框的大小,swt,eclipse-rcp,rcp,Swt,Eclipse Rcp,Rcp,我试图创建一个简单的UI,其中包含一个组合、一个文本框和一个浏览按钮。组合将包含两个值:执行时间和使用文件执行。 选择“执行时间”选项时,应显示组合框,后跟文本框。 选择“使用文件执行”选项时,应显示组合框、文本框和浏览按钮 当我在这些选项之间切换时,小部件没有正确对齐。请参阅下图。文本框大小未扩展到可用空间。 公共类TestUI{ 公共静态void main(字符串[]args) { 显示=新显示(); 最终外壳=新外壳(显示); shell.setText(“StackOverflo

我试图创建一个简单的UI,其中包含一个组合、一个文本框和一个浏览按钮。组合将包含两个值:执行时间和使用文件执行。 选择“执行时间”选项时,应显示组合框,后跟文本框。

选择“使用文件执行”选项时,应显示组合框、文本框和浏览按钮

当我在这些选项之间切换时,小部件没有正确对齐。请参阅下图。文本框大小未扩展到可用空间。

公共类TestUI{
公共静态void main(字符串[]args)
{
显示=新显示();
最终外壳=新外壳(显示);
shell.setText(“StackOverflow”);
setLayout(新的GridLayout(1,true));
复合材料=新复合材料(壳体,SWT.无);
setLayout(新的GridLayout(3,false));
setLayoutData(新的GridData(GridData.FILL_BOTH));
组合组合=新组合(组合,SWT.READ_ONLY);
字符串[]输入={“执行次数”,“使用文件执行”};
combo.setItems(输入);
Text loopText=新文本(复合,SWT.SINGLE | SWT.BORDER);
GridData GridData=新的GridData(SWT.Start | GridData.FILL_HORIZONTAL);
gridData.horizontalSpan=2;
loopText.setLayoutData(gridData);
loopText.setEnabled(false);
按钮浏览按钮=新按钮(组合,SWT.PUSH);
setText(“浏览…”);
browseButton.setVisible(假);
combo.addSelectionListener(新的SelectionAdapter(){
@凌驾
公共无效WidgeSelected(SelectionEvent e){
String text2=combo.getText();
System.out.println(text2);
if(text2.equals(“执行时间”)){
loopText.setEnabled(true);
loopText.setText(“1”);//$NON-NLS-1$
GridData gridData1=新的GridData(SWT.start、SWT.TOP、false、false);
gridData1.grabExcessHorizontalSpace=true;
gridData1.horizontalSpan=2;
setLayoutData(gridData1);
browseButton.setVisible(假);
loopText.getParent().layout();
}
if(text2.equals(“使用文件执行”)){
GridData gridData1=新的GridData(SWT.start、SWT.TOP、false、false);
gridData1.grabExcessHorizontalSpace=true;
setLayoutData(gridData1);
gridData.exclude=false;
browseButton.setVisible(真);
setFocus();
loopText.setText(“”);
loopText.setEnabled(false);
loopText.getParent().layout();
}
}
});
shell.pack();
shell.open();
而(!shell.isDisposed())
{
如果(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}
}

有人能帮我吗?

对于初学者,您不需要每次都为
文本
小部件重新创建
GridData
。相反,只需通过
gridData.horizontalSpan
修改原始实例,或者如果实际上您没有访问
gridData
实例的权限,您可以通过
((gridData)gridData.getLayoutData()).horizontalSpan
等方式访问它

<> P> >您在代码> shell >代码>底部看到空白的原因是因为您已经创建了一个具有3列的布局,然后添加了以下内容:

  • 组合框
  • Text
    (将
    horizontalSpan
    设置为2,因此使用2列)
  • 按钮
  • 组合框
    文本
    占据了全部3列,因此为
    按钮
    添加了一个新行。然后调用
    pack()
    ,并计算首选大小,该大小将用于2行,第一行仅用于2个小部件

    我们可以通过
    Shell.setSize(…)
    Shell上设置大小,而不是调用
    pack()
    并将
    Shell的大小缩小到首选大小。一般来说,您不想混合使用
    setSize(…)
    和布局,但您已经用“RCP”标记了您的帖子,因此您的
    Shell
    将已经有了大小,并且您不会手动调用
    pack()
    open()

    完整示例:

    publicstaticvoidmain(字符串[]args){
    显示=新显示();
    最终外壳=新外壳(显示);
    外壳尺寸(300,80);
    shell.setText(“StackOverflow”);
    setLayout(新的GridLayout(1,true));
    复合材料=新复合材料(壳体,SWT.无);
    setLayout(新的GridLayout(3,false));
    setLayoutData(新的GridData(SWT.FILL,SWT.FILL,true,true));
    最终组合组合=新组合(组合,SWT.只读);
    字符串[]输入={“执行次数”,“使用文件执行”};
    combo.setItems(输入);
    最终文本loopText=新文本(复合,SWT.SINGLE | SWT.BORDER);
    最终GridData textGridData=新的GridData(SWT.FILL,SWT.FILL,true,false);
    textGridData.horizontalSpan=2;
    setLayoutData(textGridData);
    loopText.setEnabled(false);
    最终按钮浏览按钮=新按钮(复合,SWT.PUSH);
    setText(“浏览…”);
    browseButton.setVisible(假);
    combo.addSelectionListener(新的SelectionAdapter(){
    @凌驾
    公共无效WidgeSelected(SelectionEvent e){
    String text2=combo.getText();
    System.out.println(text2);
    if(text2.equals(“执行时间”)){