У меня есть JLabel, на котором есть много текста. Есть ли способ сделать JLabel максимальной шириной, чтобы он обертывал текст, чтобы он не превышал эту ширину?
Спасибо
У меня есть JLabel, на котором есть много текста. Есть ли способ сделать JLabel максимальной шириной, чтобы он обертывал текст, чтобы он не превышал эту ширину?
Спасибо
Нет.
Вы можете использовать HTML в метке, но тогда вы должны жестко закодировать тег break.
Лучший подход - использовать JTextArea и включить обертывание. Вы можете изменить фон, передний план, шрифт и т.д. Текста, чтобы сделать его похожим на метку.
Примечание. Этот ответ устарел, по крайней мере, на Java 7.
В соответствии с ответом @darren вам просто нужно обернуть строку тегами <html>
и </html>
:
myLabel.setText("<html>"+ myString +"</html>");
Вам не нужно жестко закодировать теги разрыва. Текст обертывается как изменяется размер компонента.
Да, есть два аналогичных способа (первый с помощью 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);
или просто используйте
myLabel.setText("<html>"+ myString +"</html>");
Вы можете использовать HTML без трюков с твердым кодированием, если вместо этого используете теги абзацев.
JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");
JXLabel в SwingX project поддерживает обертку
JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);
Там хорошая техника здесь, прокрутите до конца статьи.
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);
Помимо обертывания текста в тегах <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);
}
});
}
}
Обертка <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.
Если вы хотите использовать JLabel, но можете попробовать этот подход,
просто отобразите количество символов, которые вы хотите отобразить на ярлыке, используя метод подстроки.
public void setLabel(String label){
String dispLabel=label.substring(0, numOfCharacter);
labelComponent.setText(dispLabel);
}