【问题标题】:Multiline JLabels - Java [duplicate]多行 JLabels - Java [重复]
【发布时间】:2010-11-25 12:27:11
【问题描述】:

我想要多行格式的JLabel 文本,否则文本会太长。我们如何在 Java 中做到这一点?

【问题讨论】:

    标签: java swing jlabel


    【解决方案1】:

    如果您不介意将标签文本包装在html 标记中,JLabel 会在其容器的宽度太窄而无法容纳所有内容时自动换行。例如,尝试将其添加到 GUI,然后将 GUI 调整为太窄 - 它会换行:

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

    【讨论】:

    • 你也可以在里面使用
    【解决方案2】:

    我建议创建您自己的自定义组件,在包装时模拟 JLabel 样式:

    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);
        }
    }
    

    然后你只需调用:

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

    如果您想pack() 正确计算父组件的高度,请确保设置行数 (textNote.setRows(2))。

    【讨论】:

    • 添加了几项以重现真实标签的外观和感觉:setOpaque(false);setFont(UIManager.getFont("Label.font"));
    【解决方案3】:

    我建议使用 JTextArea 而不是 JLabel

    在您的 JTextArea 上,您可以使用方法 .setWrapStyleWord(true) 更改单词末尾的行。

    【讨论】:

    • JTextArea 用于编辑文本,JLabel 用于显示...
    【解决方案4】:

    可以在 HTML 中use (basic) CSS

    【讨论】:

      【解决方案5】:

      具有自动调整高度的多行标签。 在标签中换行

      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();
      }
      

      谢谢, Jignesh Gothadiya

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 2015-07-12
        • 2020-05-05
        相关资源
        最近更新 更多