2010-03-10 31 views

Trả lời

34

số

Bạn có thể sử dụng HTML trong nhãn, nhưng sau đó bạn phải cứng mã thẻ nghỉ ngơi.

Một cách tiếp cận tốt hơn là sử dụng một JTextArea và biến quấn trên. Bạn có thể thay đổi nền, tiền cảnh, phông chữ vv của văn bản để làm cho nó trông giống như một nhãn.

Note, câu trả lời này là lỗi thời như ít nhất Java 7.

Theo @ câu trả lời của Darren, bạn chỉ cần quấn chuỗi với <html></html> tags:

myLabel.setText("<html>"+ myString +"</html>"); 

Bạn không cần phải mã hóa cứng bất kỳ thẻ ngắt nào. Văn bản kết thúc tốt đẹp khi thành phần thay đổi kích thước.

+11

Điều đó không hoàn toàn đúng. Nếu sử dụng HTML bạn * có thể * mã cứng các thẻ ngắt, nhưng nếu bạn sử dụng HTML và gán kích thước tối đa, văn bản sẽ được tự động bao bọc. –

+2

Nếu bạn quyết định thẻ ngắt mã cứng, hãy đảm bảo bạn sử dụng
chứ không phải
vì Java 5 không thích thẻ sau. – Craigo

+0

Tôi thích ý tưởng thứ hai vì lần đầu tiên có thể làm vỡ một từ và một nửa tôi muốn từ gói – shareef

40

Có có hai cách tương tự (đầu tiên với css style = "width: ... px", thứ hai với html WIDTH = ...:

1.

labelText = String.format("<html><div style=\"width:%dpx;\">%s</div><html>", width, text); 

2.

labelText = String.format("<html><div WIDTH=%d>%s</div><html>", width, text); 
+5

Toàn bộ điều về cách sử dụng html để làm cho văn bản quấn cảm thấy giống như một hack, nhưng đó là cách dễ nhất để làm cho nó hoạt động. Đặt kích thước trong div chính xác là những gì tôi cần để làm cho gói JLabel có chiều rộng tối đa mà không cần bất kỳ thư viện của bên thứ ba nào hoặc các chuỗi quá phức tạp. –

+5

Điều gì xảy ra nếu kích thước cửa sổ thay đổi? Văn bản phải được hiển thị theo chiều rộng nhãn mới, nhưng với giải pháp này, bạn sẽ phải đặt lại nó. –

6

có một kỹ thuật tốt here, di chuyển đến cuối của bài viết.

JLabel labelBeingUsed = myLabel; 
View view = (View) labelBeingUsed.getClientProperty(BasicHTML.propertyKey); 
view.setSize(scrollPane1.getWidth(), 0.0f); 
float w = view.getPreferredSpan(View.X_AXIS); 
float h = view.getPreferredSpan(View.Y_AXIS); 
labelBeingUsed.setSize((int) w, (int) h); 
33

hoặc đơn giản là sử dụng

myLabel.setText("<html>"+ myString +"</html>"); 
+0

Với JDK 7 là đủ, cảm ơn! 'JLabel lblTitle = new JLabel (" Văn bản tiêu đề rất rất dài của tôi "); ' – Matthieu

+2

Nếu bạn làm điều này, bạn nên đảm bảo rằng bất kỳ thực thể HTML nào trong' myString' đều được thoát. Nếu 'myString' giống như" Value <5 ", nó sẽ xuất hiện dưới dạng" Value 5 ". –

11

JXLabel trong SwingX project hỗ trợ gói

JXLabel label = new JXLabel(somelongtext); 
label.setLineWrap(true); 
+0

Cảm ơn, nó phù hợp với tôi. – ceklock

8

Bạn có thể sử dụng HTML mà không cần thẻ phá vỡ mã hóa cứng nếu bạn sử dụng thẻ đoạn để thay thế.

JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>"); 
+0

Vì một số lý do, điều này không hiệu quả đối với tôi. thẻ p theo tiêu đề và văn bản không được bao bọc. Tôi đã di chuyển ngang bị vô hiệu hóa vì vậy có thể đó là một cái gì đó để làm với nó. –

+0

Bạn không cần thẻ p. –

6

Khác với gói văn bản trong <html> thẻ, bạn cũng phải đặt nhãn vào một container tôn trọng chiều cao ưa thích và đặt chiều rộng tối đa. Ví dụ: bạn có thể đặt nhãn vào NORTH của số BorderLayout.

Đây là một chương trình làm việc đơn giản nhưng hoàn chỉnh để minh họa điều này. Bạn có thể thay đổi kích thước khung hình theo bất kỳ cách nào bạn muốn; nhãn sẽ chiếm toàn bộ chiều rộng và chiều cao sẽ điều chỉnh cho phù hợp để bọc văn bản. Lưu ý rằng tất cả những gì tôi đang làm là sử dụng các thẻ <html> và đặt nhãn ở NORTH của số BorderLayout.

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.JPanel; 
import javax.swing.JLabel; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 

public class LabelWrap { 

    public static JPanel createPanel() { 
     JLabel label = new JLabel(); 
     label.setText("<html>" 
      + "<h3>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h3>" 
      + "<p>Duis a tincidunt urna. Phasellus tristique interdum mauris, " 
      + "ut vestibulum purus suscipit eget. Aenean massa elit, accumsan " 
      + "non faucibus vel, dictum placerat urna. In bibendum est sagittis " 
      + "urna iaculis quis sagittis velit commodo. Cum sociis natoque " 
      + "penatibus et magnis dis parturient montes, nascetur ridiculus " 
      + "mus. Nam quis lacus mauris. Phasellus sem libero, convallis " 
      + "mattis sagittis vel, auctor eget ipsum. Vivamus molestie semper " 
      + "adipiscing. In ac neque quis elit suscipit pharetra. Nulla at " 
      + "orci a tortor consequat consequat vitae sit amet elit. Praesent " 
      + "commodo lacus a magna mattis vehicula. Curabitur a hendrerit " 
      + "risus. Aliquam accumsan lorem quis orci lobortis malesuada.</p>" 
      + "<p>Proin quis viverra ligula. Donec pulvinar, dui id facilisis " 
      + "vulputate, purus justo laoreet augue, a feugiat sapien dolor ut " 
      + "nisi. Sed semper augue ac felis ultrices a rutrum dui suscipit. " 
      + "Praesent et mauris non tellus gravida mollis. In hac habitasse " 
      + "platea dictumst. Vestibulum ante ipsum primis in faucibus orci " 
      + "luctus et ultrices posuere cubilia Curae; Vestibulum mattis, " 
      + "tortor sed scelerisque laoreet, tellus neque consectetur lacus, " 
      + "eget ultrices arcu mi sit amet arcu. Nam gravida, nulla interdum " 
      + "interdum gravida, elit velit malesuada arcu, nec aliquam lectus " 
      + "velit ut turpis. Praesent pretium magna in nibh hendrerit et " 
      + "elementum tellus viverra. Praesent eu ante diam. Proin risus " 
      + "eros, dapibus at eleifend sit amet, blandit eget purus. " 
      + "Pellentesque eu mollis orci. Sed venenatis diam a nisl tempor " 
      + "congue.</p>" 
      + "</html>"); 

     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(label, BorderLayout.NORTH); 
     panel.setPreferredSize(new Dimension(640, 480)); 
     return panel; 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setContentPane(createPanel()); 
       frame.pack(); 
       frame.setVisible(true); 
      } 

     }); 
    } 

} 
-6

Nếu bạn chỉ muốn sử dụng JLabel hơn bạn có thể thử phương pháp này,

chỉ hiển thị số lượng ký tự mà bạn muốn hiển thị trên nhãn bằng phương pháp xâu.

public void setLabel(String label){ 
    String dispLabel=label.substring(0, numOfCharacter); 
    labelComponent.setText(dispLabel); 
} 
Các vấn đề liên quan