SWT – 在复合材料中包裹标签
我有ScrolledComposite
,它只允许垂直滚动。 (heighthint = 400)
在这个ScrolledComposite中,我有另一个CompositeA
(滚动高度可能超过400)来存储所有其他小部件。
我有一个很长的标签(启用了SWT.WRAP
)。 但它不是包装,而是始终以单行显示。 我希望这个标签根据其父级( CompositeA
)的宽度进行换行
我忘了补充一点,这个CompositeA
是一个带有makeColumnsEqualWidth = true
的2列’GridLayout’
编辑:这是我的代码。
public void createPartControl(Composite parent) { // TODO Auto-generated method stub Display display = parent.getDisplay(); toolkit = new FormToolkit(display); form = toolkit.createForm(parent); form.setText("ABC"); Composite body = form.getBody(); TableWrapLayout layout = new TableWrapLayout(); layout.numColumns = 2; body.setLayout(layout); Label header1 = toolkit.createLabel(body, "ABC: "); Font font = new Font(display, "Arial", 11, SWT.BOLD); header1.setFont(font); Label header2 = toolkit.createLabel(body, "XYZ", SWT.WRAP); font = new Font(display, "Arial", 11, SWT.NONE); header2.setFont(font); TableWrapData wd = new TableWrapData(TableWrapData.FILL_GRAB); header2.setLayoutData(wd); form.getBody().setBackground( form.getBody().getDisplay() .getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); // Scrolled composite ScrolledComposite sc = new ScrolledComposite(body, SWT.BORDER_SOLID | SWT.V_SCROLL); sc.setAlwaysShowScrollBars(true); sc.setBackground(new Color(display, 50,255,155)); wd = new TableWrapData(TableWrapData.FILL); wd.heightHint = 360; wd.colspan = 2; wd.grabHorizontal = false; sc.setLayoutData(wd); sc.setLayout(new TableWrapLayout()); Composite innerComposite = toolkit.createComposite(sc); sc.setContent(innerComposite); innerComposite.setLayout(new TableWrapLayout()); innerComposite.setBackground(new Color(display, 255,50,50)); Section section = toolkit.createSection(innerComposite, Section.DESCRIPTION | Section.TITLE_BAR | Section.EXPANDED); wd = new TableWrapData(TableWrapData.FILL); wd.maxWidth = 600; // don't want to hardcode this value section.setLayoutData(wd); section.setText("Section"); section.setDescription("A not so long description......................"); // Composite for Section Composite sectionClient = toolkit.createComposite(section); layout = new TableWrapLayout(); layout.numColumns = 2; layout.makeColumnsEqualWidth = true; sectionClient.setLayout(layout); toolkit.createButton(sectionClient, "Button 1", SWT.RADIO); Label rightDesc = toolkit .createLabel( sectionClient, "A very long long long long long long long long long long long long long long long long long long long long desc that needs wrapping", SWT.WRAP); font = new Font(display, "Arial", 10, SWT.ITALIC); rightDesc.setFont(font); wd = new TableWrapData(); wd.rowspan = 2; rightDesc.setLayoutData(wd); Combo comboDropDown = new Combo(sectionClient, SWT.DROP_DOWN | SWT.BORDER); comboDropDown.setText("DDL"); comboDropDown.add("1"); comboDropDown.add("2"); comboDropDown.add("3"); Label lineBreak = toolkit.createSeparator(sectionClient, SWT.SEPARATOR | SWT.HORIZONTAL); wd = new TableWrapData(TableWrapData.FILL); wd.colspan = 2; lineBreak.setLayoutData(wd); /***********************/ toolkit.createButton(sectionClient, "Button 2", SWT.RADIO); Label rightDesc2 = toolkit .createLabel( sectionClient, "A long long long long long long long long long long long long long long long long long long long long desc that needs wrapping", SWT.WRAP); font = new Font(display, "Arial", 10, SWT.ITALIC); rightDesc2.setFont(font); wd = new TableWrapData(TableWrapData.FILL); wd.rowspan = 3; rightDesc2.setLayoutData(wd); toolkit.createLabel(sectionClient, "Desc", SWT.WRAP); toolkit.createText(sectionClient, "hello world", SWT.NONE); section.setClient(sectionClient); innerComposite.pack(); }
如果你运行它,你可以看到绿色的scrolledcomposite和一个红色的复合材料。 我希望红色复合宽度相对填充到scrolledcomposite的宽度,而不需要硬编码maxWidth = 600。
我在布局中遇到了同样的问题并找到了这个有用的答案。
因为’这不是一个bug,它是一个function’从这里评论#19尝试这个答案。
我为我的Label使用以下代码行。
Label tip = new Label(shell, SWT.WRAP | SWT.BORDER | SWT.LEFT); final GridData data = new GridData(SWT.HORIZONTAL, SWT.TOP, true, false, 1, 1); tip.setLayoutData(data); tip.setText("Here stands my long, long and much more longer text...");
创建Label时尝试添加SWT.WRAP。 它对我有用。
Label label = new Label(parent, SWT.WRAP);
令人惊讶的是, TableWrapLayout
管理器不会指望水平滚动的合成。 要使用Form
工具包上的布局。 我刚刚做了一个代码示例,可以在上面做什么。
public void createPartControl(Composite parent) { // TODO Auto-generated method stub Display display = parent.getDisplay(); toolkit = new FormToolkit(display); form = toolkit.createForm(parent); form.setText("ABC"); Composite body = form.getBody(); TableWrapLayout layout = new TableWrapLayout(); layout.numColumns = 2; body.setLayout(layout); Label header1 = toolkit.createLabel(body, "ABC: "); Font font = new Font(display, "Arial", 11, SWT.BOLD); header1.setFont(font); Label header2 = toolkit.createLabel(body, "XYZ", SWT.WRAP); font = new Font(display, "Arial", 11, SWT.NONE); header2.setFont(font); TableWrapData wd = new TableWrapData(); header2.setLayoutData(wd); body.setBackground(body.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); // Scrolled composite Composite sc = toolkit.createComposite(body, SWT.BORDER_SOLID | SWT.V_SCROLL); sc.setBackground(new Color(display, 50,255,155)); layout = new TableWrapLayout(); sc.setLayout(layout); wd = new TableWrapData(TableWrapData.FILL_GRAB); wd.heightHint = 360; wd.colspan = 2; sc.setLayoutData(wd); Composite innerComposite = toolkit.createComposite(sc); layout = new TableWrapLayout(); innerComposite.setLayout(layout); innerComposite.setBackground(new Color(display, 255,50,50)); wd = new TableWrapData(TableWrapData.FILL_GRAB); innerComposite.setLayoutData(wd); Section section = toolkit.createSection(innerComposite, Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED); section.setText("Section"); section.setDescription("A not so long description......................"); wd = new TableWrapData(TableWrapData.FILL_GRAB); // wd.maxWidth = 600; // don't want to hardcode this value section.setLayoutData(wd); // Composite for Section Composite sectionClient = toolkit.createComposite(section); layout = new TableWrapLayout(); layout.numColumns = 2; // layout.makeColumnsEqualWidth = true; sectionClient.setLayout(layout); section.setClient(sectionClient); wd = new TableWrapData(TableWrapData.FILL_GRAB); sectionClient.setLayoutData(wd); Label rightDesc = toolkit.createLabel(sectionClient, "A very long long long long long long long long long long long long long long long long long long long long desc that needs wrapping", SWT.WRAP); font = new Font(display, "Arial", 10, SWT.ITALIC); rightDesc.setFont(font); wd = new TableWrapData(); wd.colspan = 2; rightDesc.setLayoutData(wd); Combo comboDropDown = new Combo(sectionClient, SWT.DROP_DOWN | SWT.BORDER); comboDropDown.setText("DDL"); comboDropDown.add("1"); comboDropDown.add("2"); comboDropDown.add("3"); Label lineBreak = toolkit.createSeparator(sectionClient, SWT.SEPARATOR | SWT.HORIZONTAL); wd = new TableWrapData(TableWrapData.FILL_GRAB); lineBreak.setLayoutData(wd); // // /***********************/ // Button button1 = toolkit.createButton(sectionClient, "Button 1", SWT.RADIO); wd = new TableWrapData(); wd.colspan = 2; button1.setLayoutData(wd); Button button2 = toolkit.createButton(sectionClient, "Button 2", SWT.RADIO); wd = new TableWrapData(); wd.colspan = 2; button2.setLayoutData(wd); Label rightDesc2 = toolkit.createLabel(sectionClient, "A long long long long long long long long long long long long long long long long long long long long desc that needs wrapping", SWT.WRAP); font = new Font(display, "Arial", 10, SWT.ITALIC); rightDesc2.setFont(font); wd = new TableWrapData(); wd.colspan = 2; rightDesc2.setLayoutData(wd); Label desc = toolkit.createLabel(sectionClient, "Desc:"); Text hello = toolkit.createText(sectionClient, "hello world"); wd = new TableWrapData(TableWrapData.FILL_GRAB); hello.setLayoutData(wd); }
我可能记得这个错误,但我记得当文本改变时我必须重新布局复合。 这使得文本包装。