文本包装JLabel没有首选/最大/最小大小

问题描述 投票:0回答:2

我正在使用JLabel作为超链接。我希望它们看起来和功能完全像浏览器中的链接,因此使用文本窗格/编辑器窗格等是不可取的。问题是这些链接放在的许多容器中没有指定的大小:它们依赖于父母(甚至是祖父母)的大小。

我正在使用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 textwrapping
2个回答
2
投票

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

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

要获得首选宽度,您必须从其中一个父项获得宽度。再一次,根据布局管理器,您可能必须获得首选宽度,最大宽度或getSize()。getWidth()。如果不了解布局的更多信息,很难说你需要做多少才能做到这一点,但是你需要在标签上设置一些宽度来包装 - 没有办法解决这个问题。

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.