2009-12-03 37 views
19

Tôi đang cố tạo một JLabel Swing với nhiều dòng văn bản. Nó được thêm vào chỉ là tốt, nhưng ngắt dòng không đi qua. Làm thế nào để tôi làm điều này? Ngoài ra, tôi có thể chỉ định chiều rộng tối đa cho một JLabel và biết rằng văn bản sẽ bao bọc, như trong div không?Java: Các dấu ngắt dòng trong JLabels?

private void addLegend() { 
     JPanel comparisonPanel = getComparisonPanel(); 

     //this all displays on one line 
     JLabel legend = new JLabel("MMM FFF MMM FFFO O OOM M MMMM.\nMMM FFF MMM FFFO O OOM M MMMM.\nMMM FFF MMM FFFO O OOM M MMMM.\n"); 

     comparisonPanel.add(legend);   
    } 

Trả lời

37

Sử dụng HTML trong setText, ví dụ:

myLabel.setText("<html><body>with<br>linebreak</body></html>"); 
+2

Hoặc nếu bạn muốn động hơn, thì bạn có thể sử dụng thuộc tính chiều rộng hoặc chiều rộng bên trong html, xem [HERE] (http://stackoverflow.com/questions/2420742/make-a-jlabel -wrap-its-text-by-setting-a-max-width/3194997 # 3194997) –

6

Bạn có thể đặt HTML vào trong JLabel và sử dụng thẻ linebreak để đạt được điều này.

9

Theo mặc định, Swing không bao quanh văn bản. Nếu bạn chỉ định kích thước trên nhãn JLabel, nó sẽ chỉ vẽ phần văn bản phù hợp và sau đó thêm "..." vào cuối.

Như được đề xuất, bạn có thể sử dụng HTML để bật gói hàng. Tuy nhiên, tôi đã thực sự tạo ra một đại diện giao diện người dùng Swing tùy chỉnh cách đây không lâu để đạt được điều này và thậm chí nhiều hơn: MultiLineLabelUI.

Nó sẽ bọc văn bản của bạn để vừa với không gian có sẵn và cũng tôn trọng ngắt dòng cứng. Nếu bạn chọn để thử nó ra, nó cũng đơn giản như:

JLabel label = new JLabel("Text that'll wrap if necessary"); 
label.setUI(MultiLineLabelUI.labelUI);

Hoặc cách khác sử dụng lớp tùy chỉnh MultiLineLabel rằng ngoài việc gói văn bản hỗ trợ sự liên kết văn bản dọc và ngang.

CẬP NHẬT

Tôi bị mất tên miền với các mẫu mã gốc. Giờ đây, bạn có thể xem nó trên github: https://github.com/sasjo/multiline

+0

Nội bộ bạn cũng sử dụng HTML? – Pacerier

+0

@Pacerier: Không, không thể làm điều đó vì tôi cần phải vẽ hiệu ứng trên văn bản được bao bọc. Tôi đoán bạn có thể nói rằng nó phá vỡ các văn bản trong những cách tương tự như một JTextArea. –

+1

@ SamuelSjöberg bị hỏng Liên kết 'MultiLineLabelUI' – oliholz

3

Còn việc sử dụng tính năng gói trong JTextArea thì sao?

String text = "some really long string that might need to"+ 
        "be wrapped if the window is not wide enough"; 

    JTextArea multi = new JTextArea(text); 
    multi.setWrapStyleWord(true); 
    multi.setLineWrap(true); 
    multi.setEditable(false); 

    JLabel single = new JLabel(text); 

    JPanel textpanel = new JPanel(new GridLayout(2,1)); 
    textpanel.add(multi); 
    textpanel.add(single); 

    JFrame frame = new JFrame(); 
    frame.add(textpanel); 
    frame.pack(); 
    frame.setVisible(true); 
+0

Ý tưởng hay nhưng chỉ có một nhược điểm: Văn bản được định dạng là không thể. – Robert

0

Tôi không quản lý để chỉ định chiều rộng tối đa cho nhãn nhưng bạn có thể chỉ định chiều rộng cụ thể. Bằng cách đo độ rộng hiện tại của một JLabel chúng tôi chỉ có thể áp dụng mới cố định với nếu chiều rộng của JLabels là cao hơn mà maxWidth của chúng tôi:

JLabel label = new JLabel("<html>" + myVeryLongMessage + "<html>"); 
int maxWidth = 400; 
Dimension size = label.getPreferredSize(); 
if (size.width > maxWidth) { 
    // Estimate the number of lines 
    int lineCount = (int) Math.ceil(((double) size.width)/maxWidth); 
    lineCount += 1; // Add one extra line as reserve 
    size.width = maxWidth; // Apply the maximum width 
    // Increase the height so that all lines will be visible 
    size.height *= lineCount; 
    label.setPreferredSize(size); 
} 
7

Bạn có thể nhận ngắt dòng tự động nếu bạn thiết lập độ rộng đoạn trong html.

label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>"); 
1

Đơn giản, sử dụng HTML. Các thành phần Java Swing mặc dù không cung cấp hỗ trợ 'tuyệt vời' cho HTML, bạn có thể sử dụng nó cho các mục đích đơn giản như vậy.

label.setText("<html>This is first line.<br/>This is second line.</html>"); 
Các vấn đề liên quan