2010-01-28 38 views
44

thể trùng lặp:
Multiline text in JLabelJava swing: Nhãn nhiều dòng?

Tôi muốn làm điều này:

JLabel myLabel = new JLabel(); 
myLabel.setText("This is\na multi-line string"); 

Hiện kết quả này trong một nhãn hiển thị

This isa multi-line string 

Tôi muốn thực hiện việc này thay thế:

This is 
a multi-line string 

Mọi đề xuất?

Cảm ơn bạn


EDIT: giải pháp thực hiện

Trong cơ thể của phương pháp: Phương pháp

myLabel.setText(convertToMultiline("This is\na multi-line string")); 

Helper:

public static String convertToMultiline(String orig) 
{ 
    return "<html>" + orig.replaceAll("\n", "<br>"); 
} 
+0

Có thể cho đối tượng Label trong SWT? –

Trả lời

56

Bạn có thể sử dụng HTML trong JLabels. Để sử dụng nó, văn bản của bạn phải bắt đầu bằng <html>.

Đặt văn bản của bạn thành "<html>This is<br>a multi-line string" và nó sẽ hoạt động.

Xem Swing Tutorial: JLabelMultiline label (HTML) để biết thêm thông tin.

2

JLabel thể chấp nhận mã html. Có lẽ bạn có thể thử sử dụng thẻ <br>.

Ví dụ:

JLabel myLabel = new JLabel(); 
myLabel.setText("<html> This is a <br> multi-line string </html>"); 
5

Thủ tục trực tiếp của việc viết một văn bản nhiều dòng trong một JLabel là:

JLabel label = new JLabel("<html>First Line<br>Second Line</html>"); 
6

Một cách dễ dàng (nhưng thay đổi văn bản phong cách một chút) là sử dụng một khối <pre></pre> html .

Điều này sẽ vẫn tồn tại bất kỳ định dạng nào người dùng đã nhập nếu chuỗi bạn đang sử dụng đến từ hộp nhập của người dùng.

Ví dụ:

JLabel label = new JLabel("<html><pre>First Line\nSecond Line</pre></html>"); 
+0

Rất thú vị. Nhưng nó phải được đề cập rằng điều này cũng thay đổi phông chữ (để monospaced), mà không phải là luôn luôn mong muốn. –

5

Vấn đề với việc sử dụng html trong JLabel hoặc bất kỳ thành phần Swing là bạn thì phải tạo kiểu cho nó như html, không phải với thường lệ setFont, setForeground, vv Nếu bạn ok với điều đó, tốt.

Nếu không, bạn có thể sử dụng một cái gì đó như MultilineLabel từ JIDE, mở rộng JTextArea.Đó là một phần của mã nguồn mở của họ Commom Layer.

11
public class JMultilineLabel extends JTextArea{ 
    private static final long serialVersionUID = 1L; 
    public JMultilineLabel(String text){ 
     super(text); 
     setEditable(false); 
     setCursor(null); 
     setOpaque(false); 
     setFocusable(false); 
     setFont(UIManager.getFont("Label.font"));  
     setWrapStyleWord(true); 
     setLineWrap(true); 
    } 
} 

Nó hoàn toàn trông giống nhau đối với tôi, nhưng nó xấu xí

+0

Nó không xấu xí chút nào! Tôi đã kết thúc xây dựng trên này bằng cách có thành phần của tôi mở rộng JScrollPane mà lần lượt bọc một JTextArea cấu hình chính xác như bạn có ở đây. Gói trong JScrollPane cho phép điều thu nhỏ lại sau khi nó đã được thay đổi kích thước thành một chiều rộng lớn hơn. –

+0

Cảm ơn câu trả lời hữu ích! Để làm đẹp nó một chút, bạn cũng có thể loại bỏ đường biên giới, thêm insets, và căn giữa một cách chính xác: setBorder (new EmptyBorder (5, 5, 5, 5)); setAlignmentY (JLabel.CENTER_ALIGNMENT); – Mariana