2012-06-15 65 views
8

我想知道是否有一種直接的方式來顯示StyledText文本字段的行號 - 即使行被包裝。我在我的應用程序中使用它,如果內容變大,一些行號會很好。Java SWT顯示StyledText的行號

謝謝。

+0

據我所知,沒有真正簡單的方法;你總是可以在你的文本編輯器的左邊放置一個不可編輯的文本框。 – purtip31

+0

檢查Eclipse傢伙正在使用的實現。 –

+0

@Adam他們正在使用[SourceViewer],如[here](http://www.dsource.org/projects/dwt/wiki/JFaceTextExample)所示。我試過這個例子,但不知何故,我無法讓它正常運行。它在運行時正在做一些奇怪的事情。無論如何,我想保留我的'StyleText' :) – kon

回答

5

的關鍵是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

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 
     } 
    } 
); 
+0

你能否提一下你的方法的更多細節?在網絡上,我剛剛發現了一些使用'LineStyleListener'的例子,以某種方式突出顯示了一行的內容,例如, [這個例子](http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/TurnsecharactersredusingaLineStyleListener.htm)。謝謝。 – 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 
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(); 
    } 
}); 

注意語法的可能開銷突出重新計算調用重繪()時,很可能是可以接受的,因爲lineGetStyle()只與當前在屏幕上線叫。