【问题标题】:JLabel - Show longer text as multiple lines?JLabel - 将较长的文本显示为多行?
【发布时间】:2025-12-10 03:40:01
【问题描述】:

假设我想在JLabel 中显示很长的一行。我该怎么做?

目前,较长的行是这样出现的:

我必须调整窗口大小才能看到完整的文本。

当文本几乎达到我的JFrame 的宽度时,我怎样才能使换行符出现?

我不确定这里是否需要任何代码来回答这个问题,但仍然:

我的框架属性:

frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(450, 400));
frame.setLocation(new Point(400, 300));
frame.setLayout(new BorderLayout());

我要修改的标签:

question = new JLabel("Question:");
question.setFont(new Font("Serif", Font.BOLD, 15));
question.setHorizontalAlignment(JLabel.CENTER);

编辑: 更多详情:

我正在从文件中读取行,然后显示它们。线的大小不固定,所以我不知道把<br>放在哪里。

编辑 2:

我最终使用了JTextArea

private JTextArea textAreaProperties(JTextArea textArea) {
    textArea.setEditable(false);  
    textArea.setCursor(null);  
    textArea.setOpaque(false);  
    textArea.setFocusable(false);
    textArea.setLineWrap(true);
    textArea.setWrapStyleWord(true);
    return textArea;
}

【问题讨论】:

  • 您可能会发现answer 的第二个示例很有帮助。它使用 HTML 为工具提示提供扩展布局,但概念相同

标签: java swing jpanel jlabel


【解决方案1】:

再举一个例子,显示使用正确的布局管理器,包裹在HTML 标签中的文本将自动换行到可用空间...

public class TestHTMLLabel {

    public static void main(String[] args) {
        new TestHTMLLabel();
    }

    public TestHTMLLabel() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                StringBuilder sb = new StringBuilder(64);
                sb.append("<html>I have something to say, it's beter to burn out then to fade away.").
                                append("  This is a very long String to see if you can wrap with in").
                                append("the available space</html>");

                JLabel label = new JLabel(sb.toString());

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(label);
                frame.setSize(100, 100);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }    
        });
    }        
}

【讨论】:

  • 这对我的需要来说工作量太大了。我最终使用了JTextArea。在 OP 中查看我的编辑。
  • String 的开头添加“”和在末尾添加“”是不是很辛苦??哇,你会失望的:P
  • 我在这种解决方案中看到的问题是,当动态获取已经包含 html 标签的文本时,例如用于标记,根本不会显示(不会显示任何文本)作为 和 标记都添加了两次。很遗憾,JLabel 不支持开箱即用的多行。
  • @Timmos 在这种情况下,您不需要自己设置它。如果你认为你“可能”得到一个 html ladden String 你也可以检查它 (String#startsWith)...
  • @MadProgrammer 您需要在需要(多行)标签的任何地方进行检查......对于这样的基本功能,我更喜欢可重用的代码,因此是一个开箱即用的组件对我来说。但你当然是对的,我只是不认为这是一个非常优雅的解决方案。
【解决方案2】:

使用 HTML 显示标签内的文本。

JLabel fancyLabel = new JLabel("<html>Punch Taskmaster</html>");

(添加了Taskmaster建议的示例)

【讨论】:

  • 添加了一个例子,赢得了投票(我知道,我是这样的任务大师:))
  • &lt;br&gt; 是兄弟所在的位置。
  • @Legend 仅将文本包装在 HTML 中应该可以在正确的布局管理器下提供换行功能...但是,
    不会受到伤害;)
  • &lt;br&gt;的问题是我正在阅读很多内容,我不知道标签需要在哪里。
  • @user2027425 如果您不确定,那么最好看看 madProgrammer 给出的答案。
【解决方案3】:

用 HTML 格式化。效果很好。

import javax.swing.*;
import java.awt.*;

public class Test {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(450, 400));
        frame.setLocation(new Point(400, 300));
        frame.setLayout(new BorderLayout());

        final JLabel question = new JLabel("<html>Question:<br>What is love?<br>Baby don't hurt me<br>Don't hurt me<br>No more</html>");
        question.setFont(new Font("Serif", Font.BOLD, 15));
        question.setHorizontalAlignment(JLabel.CENTER);

        frame.add(question);

        frame.setVisible(true);
    }


}

【讨论】:

  • 当有人说“问题”这个词时,首先想到的就是哈哈
【解决方案4】:

类似的东西。 rcook给出的答案非常正确。它只是展示如何完成的示例。

 b1 = new JLabel("<html>Default Lable I have to resize the
                 <br/> window to see the complete text.</html>");

【讨论】: