【问题标题】:Text-wrapping JLabels with no preferred/max/min size没有首选/最大/最小大小的文本换行 JLabel
【发布时间】:2011-05-13 21:38:23
【问题描述】:

我使用 JLabels 作为超链接。我希望它们的外观和功能与浏览器中的链接完全相同,因此不希望使用文本窗格/编辑器窗格等。问题是这些链接将被放置在其中的许多容器都没有指定大小:它们依赖于其父母(甚至祖父母)的大小。

我正在使用 Boxes 进行布局,如果链接文本跨越了大约三分之二的框宽度,则框内容开始延伸到框的实际边界之外(这样,如果该框被包围通过 JScrollPane,会出现一个水平滚动条)。

有没有办法强制对 JLabel 进行换行?我读过的许多帖子都说,将文本放入 HTML 标签中会导致它在必要时自动换行——但无论我做什么,我都无法让它工作。我不能使用<br /> 标签,因为我不知道它们会去哪里,除非这可以自动化,即:

if(text.length() > wrapLength)
{
    //break the text into substrings and insert a <br /> at wrapLength
    //the difficulty is in figuring out the value of wrapLength
}

这是超链接类的代码:

import java.awt.Color;
import java.awt.Desktop;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.JLabel;

public class Hyperlink extends JLabel
{
    private URI uri;
    private String baseText;

    public Hyperlink(String text, String uri, Font font, Color textColor)
    {
        super(text);
        baseText = text;
        setFont(font);
        setForeground(textColor);
        setOpaque(false);

        if(Desktop.isDesktopSupported())
        {
            try
            {
                setToolTipText(uri);
                this.uri = new URI(uri);
                addMouseListener(new LinkMouseListener());
            }
            catch(URISyntaxException ex)
            {
            }
        }
    }

    private class LinkMouseListener extends MouseAdapter
    {
        @Override
        public void mouseClicked(MouseEvent e)
        {
            Desktop desktop = Desktop.getDesktop();
            try
            {
                desktop.browse(uri);
            }
            catch(IOException ioe)
            {
                System.out.println("Something went wrong..."); //DELETE
            }
        }

        @Override
        public void mouseEntered(MouseEvent e)
        {
            setText("<html><u>" + baseText + "</u></html>");
        }

        @Override
        public void mouseExited(MouseEvent e)
        {
            setText(baseText);
        }
    }
}

【问题讨论】:

    标签: java swing text jlabel word-wrap


    【解决方案1】:

    在标签上,尝试setPreferredSize(new Dimension(width, height))setSize(new Dimension(width, height))setMaximumSize(new Dimension(width, height)) 并将宽度设置为您希望它换行的宽度。我认为在你的情况下它将是 setMaximumSize(...)。

    由于您的布局管理器,它不会自动换行。一些布局管理器会忽略首选尺寸或其他尺寸。在您的情况下,您可能只需要使用不同的 setXXXSize() 方法并找到您的布局管理器尊重的方法。

    要获得首选宽度,您必须从其中一位父母那里获得宽度。再一次,根据布局管理器,您可能必须获得首选宽度、最大宽度或 getSize().getWidth()。在不了解布局的情况下,很难说出您究竟需要如何执行此操作,但您确实需要在标签上设置某种宽度以使其包裹 - 没有办法解决这个问题。

    我能想到的唯一其他选择是将标签上的首选宽度设置为您知道应该始终适合可用空间的任意值。

    【讨论】:

      【解决方案2】:

      使用 JTextArea。文本可以设置为自动换行。您可以使用文本区域属性使其看起来像一个标签。

      您可以使用自定义荧光笔“下划线”文本。然后,您只需根据需要添加/删除荧光笔。 Rectangle Painter 可以帮助您入门。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-28
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多