Java SWT 显示 StyledText 的行号

9

我想知道是否有一种简单的方法来在StyledText文本字段中显示行号,即使是换行的情况下也能显示。我在我的应用程序中使用它,如果内容变得太大,一些行号会很有用。

谢谢。


据我所知,没有真正直接的方法;您可以在文本编辑器左侧放置一个不可编辑的文本框。 - Michael
检查Eclipse团队正在使用的实现。 - Adam Arold
@Adam 他们正在使用一个SourceViewer,如此展示在这里。我尝试了这个例子,但不知怎么地,我无法使其正常运行。它在运行时做一些奇怪的事情。不管怎样,我想保留我的 StyleText: ) - kon
5个回答

6
关键是org.eclipse.swt.custom.Bullet。它基本上是一个符号(或在我们的情况下是一个数字),您可以将其添加到行的开头。
//text is your StyledText
text.addLineStyleListener(new LineStyleListener()
{
    public void lineGetStyle(LineStyleEvent e)
    {
        //Set the line number
        e.bulletIndex = text.getLineAtOffset(e.lineOffset);

        //Set the style, 12 pixles wide for each digit
        StyleRange style = new StyleRange();
        style.metrics = new GlyphMetrics(0, 0, Integer.toString(text.getLineCount()+1).length()*12);

        //Create and set the bullet
        e.bullet = new Bullet(ST.BULLET_NUMBER,style);
    }
});

2
它的功能很好。只是在总行数从9增加到10时,它错过了重绘所有线条的步骤。或者当文件中间有一行被删除时。谢谢。 - kon

4
这是我的实际工作实现。
styledText.addLineStyleListener(new LineStyleListener() {
    @Override
    public void lineGetStyle(LineStyleEvent event) {
        // Using ST.BULLET_NUMBER sometimes results in weird alignment.
        //event.bulletIndex = styledText.getLineAtOffset(event.lineOffset);
        StyleRange styleRange = new StyleRange();
        styleRange.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_GRAY);
        int maxLine = styledText.getLineCount();
        int bulletLength = Integer.toString(maxLine).length();
        // Width of number character is half the height in monospaced font, add 1 character width for right padding.
        int bulletWidth = (bulletLength + 1) * styledText.getLineHeight() / 2;
        styleRange.metrics = new GlyphMetrics(0, 0, bulletWidth);
        event.bullet = new Bullet(ST.BULLET_TEXT, styleRange);
        // getLineAtOffset() returns a zero-based line index.
        int bulletLine = styledText.getLineAtOffset(event.lineOffset) + 1;
        event.bullet.text = String.format("%" + bulletLength + "s", bulletLine);
    }
});
styledText.addModifyListener(new ModifyListener() {
    @Override
    public void modifyText(ModifyEvent e) {
        // For line number redrawing.
        styledText.redraw();
    }
});

请注意,调用redraw()时可能会导致语法高亮重新计算的额外开销,但这是可以接受的,因为lineGetStyle()仅在当前屏幕上显示的行中调用。

1
我相信使用LineStyleListener应该可以解决问题。大致代码如下:
styledText.addLineStyleListener(
    new LineStyleListener() {
        @Override
        public void lineGetStyle(LineStyleEvent event) {
            String line = event.lineText;
            int lineNumber = event.lineOffset;
            // Do stuff to add line numbers
        }
    }
);

请问您能否提供更多关于您方法的细节?在网上,我只找到了一堆使用LineStyleListener来以某种方式突出显示行内容的示例,例如这个示例。谢谢。 - kon

1

这是一种使用项目符号的方式,当内容发生更改时会更新数字:

text.addModifyListener(new ModifyListener() {
    public void modifyText(ModifyEvent event) {
        int maxLine = text.getLineCount();
        int lineCountWidth = Math.max(String.valueOf(maxLine).length(), 3);

        StyleRange style = new StyleRange();
        style.metrics = new GlyphMetrics(0, 0, lineCountWidth * 8 + 5);
        Bullet bullet = new Bullet(ST.BULLET_NUMBER, style);
        text.setLineBullet(0, text.getLineCount(), null);
        text.setLineBullet(0, text.getLineCount(), bullet);
    }
});

0
作为一个关于给行号上色的小提示:
Device device = Display.getCurrent();
style.background = new Color(device, LINE_NUMBER_BG);
style.foreground = new Color(device, LINE_NUMBER_FG);

LINE_NUMBER_BGLINE_NUMBER_FG可能是RGB对象,例如:

final RGB LINE_NUMBER_BG = new RBG(160, 80, 0); // brown
final RGB LINE_NUMBER_FG = new RGB(255, 255, 255); // white

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接