Невозможно обернуть текст в JFace TableViewerColumn

Я не могу обернуть текст внутри ячейки таблицы, когда ширина превышает указанный предел.

Код:

public static void main(String[] args) {

    List<TableData> list = Collections.synchronizedList(new ArrayList<TableData>());
    list.add(new TableData("Jack Hodgins", 24) );
    list.add(new TableData("This is just aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
            + "\n" + "hugeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
            + "\n" + "messsageeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
            + "\n" + "to checkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
            + "\n" + "wrap functionalityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", 50));

    Display display = new Display();
    Shell shell = new Shell(display);

    shell.setText("Table Viewer Column");
    shell.setSize(800, 1500);

    TableViewer viewer = new TableViewer(shell, SWT.FILL | SWT.MULTI |  SWT.H_SCROLL |  SWT.V_SCROLL |  SWT.FULL_SELECTION | SWT.BORDER);

    Table table = viewer.getTable();
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    table.setSize(1000, 1500);
    table.setLayout(new TableLayout());

    /** Column for Name */
    TableViewerColumn columnName = new TableViewerColumn(viewer, SWT.MULTI | SWT.WRAP);
    columnName.getColumn().setWidth(250);       
    columnName.getColumn().setText("Name");
    columnName.setLabelProvider(new ColumnLabelProvider() {
        @Override
        public void update(ViewerCell cell)
        {
            Object element = cell.getElement();
            if (element instanceof TableData)
            {
                TableData obj = (TableData) element;
                cell.setText(obj.getName());

            }
        }
    });

    /** Column for Age */
    TableViewerColumn columnAge = new TableViewerColumn(viewer, SWT.NONE);
    columnAge.getColumn().setWidth(100);    
    columnAge.getColumn().setText("Age");
    columnAge.setLabelProvider(new ColumnLabelProvider() {
        @Override
        public void update(ViewerCell cell)
        {
            Object element = cell.getElement();
            if (element instanceof TableData)
            {
                TableData obj = (TableData) element;
                cell.setText(String.valueOf(obj.getAge()) );

            }
        }
    });

    viewer.setContentProvider(ArrayContentProvider.getInstance());
    viewer.setInput(list);
    viewer.refresh();

    table.pack();
    shell.pack();
    shell.open();
    shell.setVisible(true);
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) display.sleep();
    }
    display.dispose();

}

public static class TableData
{
    String name;
    int age;

    public TableData(String name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


}



}

Я буду знать ширину своей ячейки таблицы, и если текст превышает этот предел, я хочу, чтобы оставшийся текст находился в новой строке.

Я просмотрел другие ссылки из stackoverflow -

многострочная функция или функция переноса текста в jface tableviewer http://git.eclipse.org/c/platform/eclipse.platform.swt.git/tree/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet231.java http://git.eclipse.org/c/platform/eclipse.platform.ui.git/tree/examples/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet006TableMultiLineCells.java

До сих пор не удается найти решение для этого. Пожалуйста, помогите.


person Lishus    schedule 18.03.2015    source источник
comment
Вы можете использовать OwnerDrawLabelProvider, но это означает рисовать ячейки самостоятельно. Однако в таблице всегда отображаются все строки с одинаковой высотой, поэтому все строки будут иметь высоту многострочной строки.   -  person greg-449    schedule 18.03.2015
comment
Привет, грег.. Так не возможно ли, чтобы высота ячейки увеличивалась в таблице только тогда, когда размер текста больше, а для остальных она остается в виде однострочной строки? Также не могли бы вы объяснить, как использовать OwnerDrawLabelProvider. Я попытался установить LabelProvider как OwnerDrawLabelProvider и не смог получить требуемую функциональность.   -  person Lishus    schedule 18.03.2015


Ответы (1)


Этот поставщик меток отрисовки владельца, установленный в качестве поставщика меток для columnName, показывает несколько строк, разделенных новыми строками. Но все строки имеют размер самой глубокой строки.

  private static class NameLabelProvider extends OwnerDrawLabelProvider
  {
    private static final int TEXT_MARGIN = 3;

    @Override
    protected void erase(final Event event, final Object element)
    {
      event.detail &= ~SWT.FOREGROUND;
    }

    @Override
    protected void measure(final Event event, final Object element)
    {
      final TableData data = (TableData)element;
      final String text = data.getName();
      final Point size = event.gc.textExtent(text);
      event.width = size.x + 2 * TEXT_MARGIN;
      event.height = Math.max(event.height, size.y + TEXT_MARGIN);
    }

    @Override
    protected void paint(final Event event, final Object element)
    {
      final TableData data = (TableData)element;
      final String text = data.getName();
      event.gc.drawText(text, event.x + TEXT_MARGIN, event.y, true);
    }
  }
person greg-449    schedule 18.03.2015
comment
Спасибо, Грег. Теперь можно добавить многострочную функцию. Просто вопрос. Есть ли какая-либо структура, которую я мог бы использовать для создания таблицы, которая обеспечивала бы автоматический перенос текста динамически в зависимости от ширины ячейки таблицы, а также только в зависимости от необходимости увеличивала бы размер не для всех строк? - person Lishus; 18.03.2015
comment
Я никогда не искал его, так как мне это не нужно. В принципе, это можно было бы написать и на SWT, но разная высота строк усложняет задачу. - person greg-449; 18.03.2015