Multiline JLabels - Java [duplicate]

南笙酒味 提交于 2019-12-01 22:34:18

问题


I want JLabel text in multiline format otherwise text will be too long. How can we do this in Java?


回答1:


If you don't mind wrapping your label text in an html tag, the JLabel will automatically word wrap it when its container's width is too narrow to hold it all. For example try adding this to a GUI and then resize the GUI to be too narrow - it will wrap:

new JLabel("<html>This is a really long line that I want to wrap around.</html>");



回答2:


I recommend creating your own custom component that emulates the JLabel style while wrapping:

import javax.swing.JTextArea;

public class TextNote extends JTextArea {
    public TextNote(String text) {
        super(text);
        setBackground(null);
        setEditable(false);
        setBorder(null);
        setLineWrap(true);
        setWrapStyleWord(true);
        setFocusable(false);
    }
}

Then you just have to call:

new TextNote("Here is multiline content.");

Make sure that you set the amount of rows (textNote.setRows(2)) if you want to pack() to calculate the height of the parent component correctly.




回答3:


I suggest to use a JTextArea instead of a JLabel

and on your JTextArea you can use the method .setWrapStyleWord(true) to change line at the end of a word.




回答4:


It is possible to use (basic) CSS in the HTML.




回答5:


MultiLine Label with auto adjust height. Wrap text in Label

private void wrapLabelText(JLabel label, String text) {
    FontMetrics fm = label.getFontMetrics(label.getFont());
    PlainDocument doc = new PlainDocument();
    Segment segment = new Segment();
    try {
        doc.insertString(0, text, null);
    } catch (BadLocationException e) {

    }

    StringBuffer sb = new StringBuffer("<html>");
    int noOfLine = 0;
    for (int i = 0; i < text.length();) {
        try {
            doc.getText(i, text.length() - i, segment);
        } catch (BadLocationException e) {
            throw new Error("Can't get line text");
        }
        int breakpoint = Utilities.getBreakLocation(segment, fm, 0, this.width - pointerSignWidth - insets.left - insets.right, null, 0);
        sb.append(text.substring(i, i + breakpoint));
        sb.append("<br/>");
        i += breakpoint;

        noOfLine++;
    }
    sb.append("</html>");
    label.setText(sb.toString());

    labelHeight = noOfLine * fm.getHeight();
    setSize();
}

Thanks, Jignesh Gothadiya



来源:https://stackoverflow.com/questions/1377181/multiline-jlabels-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!