2012-06-15 14 views
8

StyledTextテキストフィールドで行番号を表示する簡単な方法があるかどうかは、行が折り返されていても疑問でした。私は自分のアプリケーションでそれを使用しています。内容が大きくなると、いくつかの行番号がうまくなります。Java SWTはStyledTextの行番号を表示します

ありがとうございます。

+0

私が知っている限り真の直接的な方法はありません。テキストエディタの左側に編集不可能なテキストボックスを置くことができます。 – purtip31

+0

Eclipseのユーザーが使用している実装を確認してください。 –

+0

@Adam彼らは[ここ](http://www.dsource.org/projects/dwt/wiki/JFaceTextExample)のように 'SourceViewer'を使用しています。私はこの例を試しましたが、どういうわけか、それを正しく実行することができませんでした。それは実行時に奇妙なことをしていた。とにかく、私は私の '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/LurnStyleListener.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は()だけ現在画面上の線と呼ばれているため()を再描画呼び出し時に再計算を強調構文の可能なオーバーヘッドは、許容される可能性があることに留意されたいです。

関連する問題