Java SWT显示StyledText的行号
我想知道是否有一种简单的方法可以通过Java SWT显示StyledText的行号,java,numbers,swt,line,styledtext,Java,Numbers,Swt,Line,Styledtext,我想知道是否有一种简单的方法可以通过StyledText文本字段显示行号,即使行被包装。我正在我的应用程序中使用它,如果内容变得很大,一些行号会很好 谢谢。我认为使用LineStyleListener应该可以。大致如下: styledText.addLineStyleListener( new LineStyleListener() { @Override public void lineGetStyle(LineStyleEvent event) {
StyledText
文本字段显示行号,即使行被包装。我正在我的应用程序中使用它,如果内容变得很大,一些行号会很好
谢谢。我认为使用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
}
}
);
关键是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);
}
});
这是一种在内容更改时使用项目符号更新数字的方法:
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);
}
});
作为行号着色的旁注:
Device device = Display.getCurrent();
style.background = new Color(device, LINE_NUMBER_BG);
style.foreground = new Color(device, LINE_NUMBER_FG);
其中,LINE\u NUMBER\u BG
和LINE\u NUMBER\u FG
可能是RGB对象,例如:
final RGB LINE_NUMBER_BG = new RBG(160, 80, 0); // brown
final RGB LINE_NUMBER_FG = new RGB(255, 255, 255); // white
这是我的工作实现
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()只在屏幕上当前有行的情况下调用。据我所知,没有真正直接的方法;您可以始终在文本编辑器的左侧放置一个不可编辑的文本框。请检查Eclipse人员正在使用的实现。@Adam他们正在使用
SourceViewer
,如图所示。我试过这个例子,但不知怎么的,我无法让它正常运行。它在运行时做了一些奇怪的事情。无论如何,我想保留我的StyleText
:)你能谈谈你的方法吗?在网络上,我刚刚发现了一堆例子,其中LineStyleListener
以某种方式突出显示了一行的内容,例如。谢谢,它很好用。如果行的总数从9增加到10,它只会错过重新绘制所有行。或者如果在文件的中间删除了一行。非常感谢。