Tôi có một JLabel có rất nhiều văn bản trên đó. Có cách nào để làm cho JLabel có chiều rộng tối đa để nó sẽ bao bọc văn bản để làm cho nó không vượt quá chiều rộng này không?
Cảm ơn
Câu trả lời:
Không.
Bạn có thể sử dụng HTML trong nhãn, nhưng sau đó bạn phải viết mã cứng cho thẻ ngắt.
Một cách tiếp cận tốt hơn là sử dụng JTextArea và bật gói. Bạn có thể thay đổi nền, nền trước, phông chữ, v.v. của văn bản để làm cho nó giống như một nhãn.
Lưu ý, câu trả lời này đã lỗi thời với ít nhất là Java 7.
Theo câu trả lời của @ darren, bạn chỉ cần quấn chuỗi bằng <html>
và </html>
các thẻ:
myLabel.setText("<html>"+ myString +"</html>");
Bạn không cần phải mã hóa bất kỳ thẻ ngắt nào. Văn bản kết thúc khi thành phần thay đổi kích thước.
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);
</html>
btw :)
hoặc đơn giản là sử dụng
myLabel.setText("<html>"+ myString +"</html>");
JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
myString
đều được thoát trước. Nếu myString
là một cái gì đó như "Giá trị <5", nó sẽ xuất hiện dưới dạng "Giá trị 5".
Bạn có thể sử dụng HTML mà không có thẻ ngắt đoạn mã hóa cứng nếu bạn sử dụng thẻ đoạn văn.
JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");
JXLabel trong dự án SwingX hỗ trợ gói
JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);
Có một kỹ thuật hay ở đây , hãy cuộn đến cuối 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);
Ngoài việc gói văn bản trong <html>
thẻ, bạn cũng phải đặt nhãn vào một vùng chứa tôn trọng chiều cao ưa thích và đặt chiều rộng thành tối đa. Ví dụ, bạn có thể đặt nhãn vào BẮC của a BorderLayout
.
Đây là một chương trình làm việc đơn giản nhưng đầy đủ để minh họa điều này. Bạn có thể thay đổi kích thước khung 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 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 <html>
các thẻ và đặt nhãn ở BẮC của 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);
}
});
}
}
<html>
gói hoạt động nhưng không phải trong mọi trường hợp. Nếu vùng chứa mẹ sử dụng FlowLayout thì nó sẽ không hoạt động. Do đó tôi đặt nó thành BoxLayout. Nhìn vào đoạn mã này:
javax.swing.JPanel pRefundNote = new javax.swing.JPanel();
javax.swing.JLabel lbNote = new javax.swing.JLabel();
pRefundNote.setAlignmentX(0.0F);
pRefundNote.setMaximumSize(new java.awt.Dimension(32767, 33));
pRefundNote.setLayout(new javax.swing.BoxLayout(pRefundNote, javax.swing.BoxLayout.X_AXIS));
lbNote.setText("<html>Select items using Shift or Ctrl and Up/Down keys or Mouse</html>");
lbNote.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lbNote.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
pRefundNote.add(lbNote);
Đừng thêm <br>
vì nó sẽ phá vỡ văn bản của bạn ngay cả khi bạn phóng to khung chính và vùng chứa pRefundNote.
Nếu bạn chỉ muốn sử dụng JLabel, bạn có thể thử cách tiếp cận này,
chỉ hiển thị số ký tự bạn muốn hiển thị trên nhãn bằng phương pháp chuỗi con.
public void setLabel(String label){
String dispLabel=label.substring(0, numOfCharacter);
labelComponent.setText(dispLabel);
}