Одновременное выравнивание по правому краю и перенос текста в метку SWT в Linux / Gnome - PullRequest
2 голосов
/ 16 февраля 2011

У меня есть проблема, которая появляется при использовании Ubuntu Linux / Gnome, но, похоже, не в Windows (как видно из одного из ответов), что я не могу использовать SWT.RIGHT | SWT.WRAP вместе, при создании новой метки, чтобы чтобы текст выровнялся по правому краю и можно было оборачивать.

Справочная информация:

Я использую простую 2-колоночную разметку сетки в мастере, чтобы создать динамическое число строк с одной меткой и одним текстовым полем на строку. Я хочу, чтобы надписи были фиксированного размера и чтобы текст внутри них был выровнен по правому краю, например:

      label 1: [Text field 1]
Another label: [Text field 2]
 Another label
  with wrapped [Text field 3]
         text: 

Сетка создается так:

GridLayout gl = new GridLayout();
gl.numColumns = 2;
composite.setLayout(gl);

и вот как я пытаюсь создать строки (с одной меткой и одним текстовым полем на строку):

for (String labelText : labelTexts) {
    Label fieldLabel = new Label(this.composite, SWT.RIGHT | SWT.WRAP | SWT.BORDER );
    fieldLabel.setText(labelText);
    GridData labelGridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
    labelGridData.widthHint = 160;
    fieldLabel.setLayoutData(labelGridData);

    Text textField = new Text(this.composite, SWT.BORDER);
    GridData textGridData = new GridData(GridData.FILL_HORIZONTAL);
    textGridData.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
    textGridData.widthHint = 248;
    textField.setLayoutData(textGridData);
}

Проблема заключается в этой части: SWT.RIGHT | SWT.WRAP выше, так как не получается использовать их обоих одновременно. Так как же мне обойти это, и выровнять текст по меткам по правому краю и сделать обтекание текстом?

Ответы [ 2 ]

4 голосов
/ 16 февраля 2011

Я пытался воссоздать проблему на моей машине с Vista и использовал eclipse 3.6.Но это сработало для меня.

Вот вывод:

enter image description here

Код, который я использовал, выглядит следующим образом:

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class RightAlign 
{
    public static void main(String[] args)
    {

        Display display = new Display();
        Shell shell = new Shell(display);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        shell.setLayout(layout);
        shell.setText("Alignment Test");

        String[] labelTexts = new String[]{"label 1:","Another label:","Another label with wrapped text:"};

        for (String labelText : labelTexts) 
        {
            Label  fieldLabel = new Label(shell,  SWT.RIGHT |SWT.WRAP | SWT.BORDER );
            fieldLabel.setText(labelText);
            GridData labelGridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
            labelGridData.widthHint = 100;
            fieldLabel.setLayoutData(labelGridData);

            Text textField = new Text(shell, SWT.BORDER);
            GridData textGridData = new GridData(GridData.FILL_HORIZONTAL);
            textGridData.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
            textGridData.widthHint = 248;
            textField.setLayoutData(textGridData);
        }

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

    }
}

Единственное, что я изменил , это labelGridData.widthHint с 160 до 100.Самая длинная этикетка была < 160 и, следовательно, не была завернута.

1 голос
/ 16 февраля 2011

Краткий ответ:

Используйте StyledText вместо метки - все вещи равны.

rightAlign

Подробный ответ:

В GTK есть ряд ошибок ( 120256 , являющихся хорошей точкой входа) в отношении этой «особенности», большинство из которых помечены как дубликаты друг друга, большинство из них ужасновернуться к gtk + 2.4 / 2.6, некоторые отмечены как исправленные.Тем не менее, в версии 2011 gtk2 + 2.22 (для Maverick Market) ошибки кажутся удивительно устойчивыми.

Прочитав этот отчет об ошибках, я извлек все дерево исходных текстов SWT для ключевого слова wordwrap, и похоже, что это Стив Нортовер.Я работал над этой ошибкой намного лучше с помощью StyledText Control, чем с Label Control.

Я повторно использовал тестовый пример Favonius (спасибо Favonius ;-), и это, очевидно, было хорошим предзнаменованием.

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class RightAlign2
{
    public static void main(String[] args)
    {

        Display display = new Display();
        Shell shell = new Shell(display);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        shell.setLayout(layout);
        shell.setText("Alignment Test");

        String[] labelTexts = new String[]{"label 1:","Another label:","Another label with wrapped text:"};

        for (String labelText : labelTexts)
        {
            StyledText  fieldText = new StyledText(shell, SWT.RIGHT |SWT.WRAP | SWT.BORDER );
            fieldText.setText(labelText);
            GridData labelGridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
            labelGridData.widthHint = 100;
            fieldText.setLayoutData(labelGridData);

            Text textField = new Text(shell, SWT.BORDER);
            GridData textGridData = new GridData(GridData.FILL_HORIZONTAL);
            textGridData.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
            textGridData.widthHint = 248;
            textField.setLayoutData(textGridData);
        }

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

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...