Wrap abel within a composite

15,642

Solution 1

I have the same problem here in my layout and found this useful answer.

Because of 'it is a not bug, it is a feature' try this answer from comment #19 here.

I use the following lines of code for my 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...");

Solution 2

Try adding SWT.WRAP when creating the Label. It worked for me.

Label label = new Label(parent, SWT.WRAP);
Share:
15,642
humansg
Author by

humansg

Updated on October 20, 2022

Comments

  • humansg
    humansg over 1 year

    I have ScrolledComposite which allows only vertical scrolling. (heighthint = 400).

    Within this ScrolledComposite, I have another CompositeA (height may exceed 400 for scrolling) to store all other widgets.

    I have a very long label (with SWT.WRAP enabled). But instead of wrapping, it is always showing in a single line. I want this label to wrap according to the width of its parent (CompositeA)

    I forgot to add that this CompositeA is a 2 column GridLayout with makeColumnsEqualWidth = true.

    Here is my code:

    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();
    
    }
    

    If you run it, you can see a green scrolledcomposite and a red composite. I want the red composite width to fill to the width of the scrolledcomposite relatively without hardcoding maxWidth = 600.

    • Baldrick
      Baldrick almost 12 years
      I think I had a similar issue, and I solved it using FILL for horizontalAlignment and true for grabExcessHorizontalSpace in the GridData of the label and the Composite that contained it. Hope this helps.
    • humansg
      humansg almost 12 years
      i think when i call innerComposite.pack() it will layout the label in a single line? But without innerComposite.pack() i will not be able to see the entire layout.
  • dbalakirev
    dbalakirev almost 12 years
    Check Zoltán Ujhelyi's solution here as well: stackoverflow.com/questions/3499349/…
  • humansg
    humansg almost 12 years
    the text did not change. is just that it is already a long text when it first display
  • dbalakirev
    dbalakirev almost 12 years
    And you do a layout after you display it first?
  • humansg
    humansg almost 12 years
    yes i did a layout for it. the problem is that I do not want to hardcode the width. I want it to automatically follow the ScrolledComposite. But I don't seems to be able to get the width of the SC. Keep returning 0.
  • dbalakirev
    dbalakirev almost 12 years
    Interesting. In solution i linked the chap is adding a layoutData setting to the label. Which you don't as i see.
  • dbalakirev
    dbalakirev almost 12 years
    Nope. You do actaully. Ignore me :)
  • humansg
    humansg almost 12 years
    well.. i have no problem if i did not add it into a scrolled composite. but once i add into a scrolledcomposite, i will have the problem that the label is in a single line if i did not specify the width. but i want things to be relative instead of hardcoded..
  • Lii
    Lii over 7 years
    new GridData(SWT.HORIZONTAL, ...) look weird, HORIZONTAL is not one of the allowed constants according to the GridData documentation.