同时右键对齐并在Linux / Gnome中的SWT标签中包装文本

时间:2011-02-16 09:38:54

标签: java eclipse swt

我有一个问题出现在使用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的创建方式如下:

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 个答案:

答案 0 :(得分:4)

我试图在我的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.widthHint160的{​​{1}}。最长的标签是100,因此没有被包裹。

答案 1 :(得分:1)

简答:

使用StyledText而不是Label - 所有条件都相同。

rightAlign

详细解答:

GTK中存在许多错误(120256是一个很好的切入点)关于这个“功能”,其中大多数都标记为彼此重复,其中大多数都追溯到gtk + 2.4 / 2.6一些标记固定。然而,在2011年的gtk2 + 2.22版(针对Maverick Market)中,错误似乎非常有弹性。

阅读了这个错误报告之后,我在整个SWT源代码树中找到了wordwrap关键字,看起来Steve Northover男孩们使用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();

    }
}