我有一个JLabel,上面有很多文字。有没有办法让JLabel有一个最大宽度,以便它包装文本使其不超过这个宽度?
由于
答案 0 :(得分:47)
没有。
您可以在标签中使用HTML,但是您必须对break标记进行硬编码。
更好的方法是使用JTextArea并打开包装。您可以更改文本的背景,前景,字体等,使其看起来像标签。
请注意,至少从Java 7开始,这个答案已经过时了。
根据@darren的回答,你只需要用<html>
和</html>
标签包裹字符串:
myLabel.setText("<html>"+ myString +"</html>");
您无需对任何中断标记进行硬编码。当组件调整大小时,文本会自动换行。
答案 1 :(得分:45)
是的,有两种类似的方式(首先是css style =“width:... px”,第二种是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);
答案 2 :(得分:35)
或只是使用
myLabel.setText("<html>"+ myString +"</html>");
答案 3 :(得分:11)
SwingX project中的JXLabel支持包装
JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);
答案 4 :(得分:10)
如果使用段落标记,则可以使用不使用硬编码中断标记的HTML。
JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");
答案 5 :(得分:7)
有一个很好的技巧here,滚动到文章的末尾。
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);
答案 6 :(得分:6)
除了将文本包装在<html>
标签中之外,您还必须将标签放入一个尊重首选高度的容器中,并将宽度设置为最大值。例如,您可以将标签放在BorderLayout
的北部。
这是一个简单但完整的工作程序来说明这一点。您可以以任何方式调整框架的大小;标签将占据整个宽度,高度将相应调整以包裹文本。请注意,我正在做的就是使用<html>
标记并将标签放在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);
}
});
}
}
答案 7 :(得分:0)
<html>
包装有效,但并非在所有情况下均可。如果父容器使用FlowLayout,则它将无法正常工作。因此,我将其设置为BoxLayout。看下面的代码片段:
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);
不要添加<br>
,因为即使您放大父框架和pRefundNote容器,它也会破坏文本。
答案 8 :(得分:0)
这对我来说非常有效。不完全是文本换行,但它使文本居中。根据此处的答案,我使用了 align
属性并设置了 center
。 More about align
tag here
label.setText("<html><p align=\"center\">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p></html>")
screenshot from my project (我还不能发布图片。抱歉。希望这会有所帮助。)
答案 9 :(得分:-6)
如果你只想使用JLabel而不是尝试这种方法,
使用子字符串方法显示要在标签上显示的字符数。
public void setLabel(String label){
String dispLabel=label.substring(0, numOfCharacter);
labelComponent.setText(dispLabel);
}