У меня есть JLabel, на котором много текста. Есть ли способ сделать JLabel максимальной шириной, чтобы он обертывал текст, чтобы он не превышал эту ширину?
благодаря
У меня есть JLabel, на котором много текста. Есть ли способ сделать JLabel максимальной шириной, чтобы он обертывал текст, чтобы он не превышал эту ширину?
благодаря
Ответы:
Нет.
Вы можете использовать HTML в метке, но тогда вы должны жестко закодировать тег прерывания.
Лучше использовать JTextArea и включить перенос. Вы можете изменить фон, передний план, шрифт и т. Д. Текста, чтобы он выглядел как метка.
Обратите внимание, что этот ответ устарел как минимум на Java 7.
В соответствии с @ ответом Даррена, вам просто нужно обернуть строку с
<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);
источник
</html>
кстати :)или просто используйте
myLabel.setText("<html>"+ myString +"</html>");
источник
JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
myString
сначала экранировать любые HTML-объекты . ЕслиmyString
это что-то вроде «Значение <5», оно будет отображаться как «Значение 5».Вы можете использовать HTML без жестких тегов разрыва кода, если вместо этого используете теги абзаца.
JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");
источник
JXLabel в проекте SwingX поддерживает упаковку
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); }
источник