1

我正在尝试在 TableViewer 组件的单元格中显示一些内容。它显示几乎所有字符,除了制表符 (\t) 字符。看起来它忽略了 \t 字符。任何人都知道任何解决这个问题?

为了解决这个问题,我尝试用几个空格字符替换 \t,它看起来像 Tab 字符的行为。但我不知道为什么 '\t' 没有在 TableViewer 中正确显示。

任何建议表示赞赏。谢谢。

4

2 回答 2

1

我认为 \t 字符在 SWT 组件中呈现为 0 宽度,这就是您没有看到它的原因。你想用标签做什么?通常,制表符用于将文本与预定义的列起点对齐 - 您是否可以使用单独的表格列而不是制表符来实现相同的结果?或者,如果您需要缩进层次结构中的某些元素,您是否想要使用具有多个列的 TreeViewer 。

为了显示文件的内容,StyledText组件可能更适合您的需要。这是Eclipse编辑器等使用的控件,非常灵活。

它支持选项卡,您可以使用LineStyleListener来呈现表格,如行​​边框。有几个优秀的教程可以帮助您入门:

用 SWT StyledText 小部件弄湿你的脚

深入了解 SWT StyledText 小部件

如果您不想要编辑支持,那么您的使用将比那些教程中描述的大部分内容简单得多。

于 2012-05-07T08:51:34.507 回答
1

您可以使用 Textlayout 并使用 setTabs() 以像素为单位设置选项卡的大小。这是一个示例:

package de.abas.erp.wb.base.tools.identifiersearchview;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.TextLayout;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;

public class TabSnippet {

public static void main(final String [] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
        shell.setText("Table:\t\t Change style \t multiple times in cell");
    shell.setLayout(new FillLayout());
    final Table table = new Table(shell, SWT.MULTI | SWT.FULL_SELECTION);
    table.setLinesVisible(true);
    for(int i = 0; i < 10; i++) {
        new TableItem(table, SWT.NONE);
    }
    final TextLayout textLayout = new TextLayout(display);
        textLayout.setText("SWT:\t Standard \t Widget \t Toolkit");
        textLayout.setTabs(new int[] { 100 });

        /*
         * NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly.
         * Therefore, it is critical for performance that these methods be as
         * efficient as possible.
         */
        table.addListener(SWT.PaintItem, new Listener() {
            @Override
            public void handleEvent(final Event event) {
                textLayout.draw(event.gc, event.x, event.y);
            }
        });
        final Rectangle textLayoutBounds = textLayout.getBounds();
        table.addListener(SWT.MeasureItem, new Listener() {
            @Override
            public void handleEvent(final Event e) {
                e.width = textLayoutBounds.width + 2;
                e.height = textLayoutBounds.height + 2;
            }
        });
    shell.setSize(400, 200);
    shell.open();
    while(!shell.isDisposed()) {
        if(!display.readAndDispatch()) {
            display.sleep();
        }
    }
    textLayout.dispose();
    display.dispose();
}
}
于 2012-05-07T13:36:09.430 回答