Java 切换顶部控件时,StackLayout中的SWT文本小部件无法调整高度

Java 切换顶部控件时,StackLayout中的SWT文本小部件无法调整高度,java,layout,swt,Java,Layout,Swt,我在JFace对话框中有一个SWT组合。在合成图的一行上,我有一个组,其中有4个按钮垂直堆叠。它旁边是一个文本小部件,需要通过用户输入在多行和单行之间来回切换 我在StackLayout中有两个不同的文本小部件,根据需要显示其中一个。但是我找不到一种方法来调整堆栈组合和文本小部件的高度,这取决于哪个文本是顶部控件。在单模式下,我只需要一行高度,在多模式下,我需要填充与它旁边的组相同的垂直空间。我可以在创建组合时将文本的高度调整为这两种情况之一,但在从一个文本切换到另一个文本后,当我告诉他们调整高

我在JFace对话框中有一个SWT组合。在合成图的一行上,我有一个组,其中有4个按钮垂直堆叠。它旁边是一个文本小部件,需要通过用户输入在多行和单行之间来回切换

我在StackLayout中有两个不同的文本小部件,根据需要显示其中一个。但是我找不到一种方法来调整堆栈组合和文本小部件的高度,这取决于哪个文本是顶部控件。在单模式下,我只需要一行高度,在多模式下,我需要填充与它旁边的组相同的垂直空间。我可以在创建组合时将文本的高度调整为这两种情况之一,但在从一个文本切换到另一个文本后,当我告诉他们调整高度时,他们不会调整高度

下面是一个代码片段,它导致文本小部件总是太高,并且在单一模式下永远不会减小到一行高度

这是复合材料

@凌驾 受保护的控件CreateDialogArea复合父级{ 容器=复合super.createDialogAreaparent; GridDataFactory.fillDefaults.grabtrue、true.applyTocontainer; GridLayoutFactory.fillDefaults.numColumns2.margins5,5.applyTocontainer; Group Group=新的Groupcontainer,SWT.NONE; GridDataFactory.fillDefaults.alignSWT.FILL、SWT.FILL.grabtrue、true.applyTogroup; GridLayoutFactory.fillDefaults.applyTogroup; 对于M_属性属性属性:M_ATTRIBUTE.values{ 按钮按钮=新按钮组,SWT.CHECK; GridDataFactory.fillDefaults.applyTobutton; button.setTextattr.getDisplayValue; } 堆栈=新的Compositecontainer,SWT.NONE; GridDataFactory.fillDefaults.grabtrue、true.alignSWT.FILL、SWT.FILL.applyTostack; stackLayout=新的stackLayout; stack.setLayoutstackLayout; valueTextMulti=新文本堆栈,SWT.BORDER | SWT.MULTI; GridDataFactory.fillDefaults.grabtrue、true.alignSWT.FILL、SWT.FILL.applyTovalueTextMulti; valueTextMulti.addModifyListenervalueTextModifyListener; valueTextSingle=新文本堆栈,SWT.BORDER | SWT.SINGLE; GridDataFactory.fillDefaults.grabtrue、false.alignSWT.FILL、SWT.TOP.applyTovalueTextSingle; valueTextSingle.addModifyListenervalueTextModifyListener; stackLayout.topControl=valueTextMulti; 返回容器; } 这里有一个switch语句,它显示了如何在单行和多行文本小部件之间切换

@凌驾 公共作废selectionChangedSelectionChangedEvent事件{ IsStructuredSelection=IsStructuredSelection事件.getSelection; M_DATA_TYPE TYPE=M_DATA_TYPE sel.getFirstElement; 开关类型{ 个案列表: 大小写哈希表: stackLayout.topControl=valueTextMulti; setNumRowsvalueTextMulti,10; GridData valueTextMulti.getLayoutData.verticalAlignment=SWT.FILL; GridData valueTextMulti.getLayoutData.grabExcessVerticalSpace=true; GridData stack.getLayoutData.grabExcessVerticalSpace=true; container.getParent.layout; 打破 违约: stackLayout.topControl=valueTextSingle; GridData valueTextSingle.getLayoutData.verticalAlignment=SWT.TOP; GridData valueTextSingle.getLayoutData.grabExcessVerticalSpace=false; GridData stack.getLayoutData.grabExcessVerticalSpace=false; setNumRowsvalueTextSingle,1; container.getParent.layout; 打破 } } 这是一种根据字符行调整文本高度的方法,我从中得到

受保护的void setNumRowsText文本,int行{ GC=新的GCtext; 尝试 { gc.setFonttext.getFont; FontMetrics fm=gc.getFontMetrics; int height=行*fm.getHeight; text.setSizetext.getSize.x,高度; text.getParent.layout; } 最后 { gc.dispose; } }
我通过在StackLayout组合中创建额外的组合来实现它,每个文本小部件实例对应一个组合。每个文本小部件都有固定的布局数据,一个带有align=SWT.FILL,另一个带有SWT.TOP。然后我在StackLayout中切换容器组合,而不是切换文本小部件。这还有一个额外的优点,即不需要直接设置小部件的高度。布局也必须是c 切换内容后,在StackLayout组合上调用。在层次结构中更高层次的容器上调用布局不起作用

这是我修改过的代码:

@凌驾 受保护的控件CreateDialogArea复合父级{ 容器=复合super.createDialogAreaparent; GridDataFactory.fillDefaults.grabtrue、true.applyTocontainer; GridLayoutFactory.fillDefaults.numColumns2.margins5,5.applyTocontainer; Group Group=新的Groupcontainer,SWT.NONE; GridDataFactory.fillDefaults.alignSWT.FILL、SWT.FILL.grabtrue、false.applyTogroup; GridLayoutFactory.fillDefaults.applyTogroup; 对于M_属性属性属性:M_ATTRIBUTE.values{ 按钮按钮=新按钮组,SWT.CHECK; GridDataFactory.fillDefaults.applyTobutton; button.setTextattr.getDisplayValue; this.buttons.putttr,按钮; } 堆栈=新的Compositecontainer,SWT.NONE; GridDataFactory.fillDefaults.grabtrue、true.alignSWT.FILL、SWT.FILL.applyTostack; stackLayout=新的stackLayout; stack.setLayoutstackLayout; compMultiLine=新的Compositestack,SWT.NONE; GridDataFactory.fillDefaults.applyTocompMultiLine; GridLayoutFactory.fillDefaults.applyTocompMultiLine; valueTextMulti=新的TextcompMultiLine,SWT.BORDER | SWT.MULTI | SWT.WRAP; GridDataFactory.fillDefaults.grabtrue、true.applyTovalueTextMulti; valueTextMulti.addModifyListenervalueTextModifyListener; compSingleLine=新的Compositestack,SWT.NONE; GridDataFactory.fillDefaults.applyTocompSingleLine; GridLayoutFactory.fillDefaults.applyTocompSingleLine; valueTextSingle=新的TextcompSingleLine,SWT.BORDER | SWT.SINGLE | SWT.WRAP; GridDataFactory.fillDefaults.grabtrue、false.alignSWT.FILL、SWT.TOP.applyTovalueTextSingle; valueTextSingle.addModifyListenervalueTextModifyListener; stackLayout.topControl=compMultiLine; 返回容器; } @凌驾 公共作废selectionChangedSelectionChangedEvent事件{ IsStructuredSelection=IsStructuredSelection事件.getSelection; M_DATA_TYPE TYPE=M_DATA_TYPE sel.getFirstElement; 开关类型{ 个案列表: 大小写哈希表: stackLayout.topControl=compMultiLine; 堆栈布局; 打破 违约: stackLayout.topControl=compSingleLine; 堆栈布局; 打破 } }