2012-06-15 39 views
8

Tôi đã tự hỏi nếu có một cách đơn giản để hiển thị số dòng với trường văn bản StyledText - ngay cả khi các dòng được bao bọc. Tôi đang sử dụng nó trong ứng dụng của tôi và nếu nội dung được lớn, một số số dòng sẽ được tốt đẹp.Java SWT hiển thị số dòng cho StyledText

Cảm ơn bạn.

+0

Không có cách nào thực sự đơn giản theo như tôi biết; bạn luôn có thể đặt một hộp văn bản không thể chỉnh sửa ở bên trái trình soạn thảo văn bản của bạn. – purtip31

+0

Kiểm tra cài đặt mà các chuyên gia Eclipse đang sử dụng. –

+0

@Adam Họ đang sử dụng 'SourceViewer' như được hiển thị [ở đây] (http://www.dsource.org/projects/dwt/wiki/JFaceTextExample). Tôi đã thử ví dụ này, nhưng bằng cách nào đó tôi đã không thể làm cho nó chạy đúng cách. Nó đang làm những thứ kỳ lạ trong thời gian chạy. Dù sao, tôi muốn giữ 'StyleText' của tôi :) – kon

Trả lời

5

Điều quan trọng là org.eclipse.swt.custom.Bullet. Về cơ bản nó là một biểu tượng (hoặc trong trường hợp của chúng tôi là một số) bạn có thể thêm vào đầu của một dòng.

//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

Nó hoạt động tốt đẹp. Nó chỉ nhớ vẽ lại tất cả các dòng nếu tổng số dòng tăng từ 9 đến 10. Hoặc nếu một dòng được xóa ở giữa tệp. Cảm ơn bạn. – kon

1

Tôi tin rằng việc sử dụng một LineStyleListener sẽ hoạt động. Một cái gì đó dọc theo dòng:

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

Bạn có thể đề cập đến một số chi tiết khác về cách tiếp cận của mình không? Trên web, tôi chỉ tìm thấy một loạt các ví dụ với 'LineStyleListener' làm nổi bật nội dung của một dòng theo một cách nhất định, ví dụ: [ví dụ này] (http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/Turnsecharacterssử dụngLineStyleListener.htm). Cảm ơn bạn. – kon

1

Đây là một cách để sử dụng đạn mà cập nhật những con số khi thay đổi nội dung:

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

Là một phụ lưu ý cho tô đầy lên cái số dòng:

Device device = Display.getCurrent(); 
style.background = new Color(device, LINE_NUMBER_BG); 
style.foreground = new Color(device, LINE_NUMBER_FG); 

nơi LINE_NUMBER_BGLINE_NUMBER_FG có thể là đối tượng RGB chẳng hạn như:

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

Đây là triển khai hoạt động của tôi.

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(); 
    } 
}); 

Lưu ý rằng các chi phí có thể có của cú pháp làm nổi bật tính toán lại khi gọi vẽ lại() có khả năng là có thể chấp nhận, bởi vì lineGetStyle() chỉ được gọi với dòng hiện trên màn hình.

Các vấn đề liên quan