Java 没有首选/max/min大小的文本包装JLabel

Java 没有首选/max/min大小的文本包装JLabel,java,swing,text,jlabel,word-wrap,Java,Swing,Text,Jlabel,Word Wrap,我使用jlabel作为超链接。我希望它们的外观和功能与浏览器中的链接完全相同,因此不希望使用文本窗格/编辑器窗格等。问题是,这些链接将放置在其中的许多容器没有指定大小:它们依赖于其父代(甚至是祖父母)的大小 我使用框进行布局,如果链接文本的宽度超过框宽度的三分之二,框内容开始超出框的实际边界(因此,如果框被JScrollPane包围,则会出现水平滚动条) 有没有办法在JLabel上强制包装?我读过的许多帖子都说,将文本放入HTML标记中会导致它在必要时自动包装——但无论我做什么,我都无法让它正常

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

我使用框进行布局,如果链接文本的宽度超过框宽度的三分之二,框内容开始超出框的实际边界(因此,如果框被JScrollPane包围,则会出现水平滚动条)

有没有办法在JLabel上强制包装?我读过的许多帖子都说,将文本放入HTML标记中会导致它在必要时自动包装——但无论我做什么,我都无法让它正常工作。我不能使用

标记,因为我不知道它们会去哪里,除非这可以自动化,即:

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
}
if(text.length()>wrapLength)
{
//将文本拆分为子字符串,并在wrapLength处插入一个
//困难在于计算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.awt.Color;
导入java.awt.Desktop;
导入java.awt.Font;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.io.IOException;
导入java.net.URI;
导入java.net.URISyntaxException;
导入javax.swing.JLabel;
公共类超链接扩展JLabel
{
私有URI;
私有字符串基文本;
公共超链接(字符串文本、字符串uri、字体、颜色文本颜色)
{
超级(文本);
baseText=文本;
setFont(字体);
设置前景(文本颜色);
设置不透明(假);
if(Desktop.isDesktopSupported())
{
尝试
{
setToolTipText(uri);
this.uri=新uri(uri);
addMouseListener(新链接MouseListener());
}
捕获(URISyntaxException-ex)
{
}
}
}
私有类LinkMouseListener扩展了MouseAdapter
{
@凌驾
公共无效mouseClicked(MouseEvent e)
{
Desktop=Desktop.getDesktop();
尝试
{
桌面浏览(uri);
}
捕获(ioe异常ioe)
{
System.out.println(“出错了…”);//删除
}
}
@凌驾
公共无效鼠标事件(鼠标事件e)
{
setText(“+baseText+”);
}
@凌驾
公共无效mouseExited(MouseEvent e)
{
setText(baseText);
}
}
}

在标签上,尝试
设置首选尺寸(新尺寸(宽度,高度))
设置尺寸(新尺寸(宽度,高度))
设置最大尺寸(新尺寸(宽度,高度))
并将宽度设置为要包裹的宽度。我想在您的情况下,它将设置为MaximumSize(…)

由于布局管理器的原因,它不会自动换行。某些布局管理器将忽略首选尺寸或其他尺寸。在您的例子中,您可能只需要使用不同的setXXXSize()方法,并找到布局管理器所尊重的方法

要获得首选宽度,您必须从父母之一处获得宽度。同样,根据布局管理器的不同,您可能需要获得首选宽度、最大宽度或getSize().getWidth()。在不了解更多布局的情况下,很难说具体需要做什么,但您确实需要在标签上设置某种宽度,以便包装-这是没有办法的


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

在标签上,尝试
setPreferredSize(新尺寸(宽度,高度))
setSize(新尺寸(宽度,高度))
setMaximumSize(新尺寸(宽度,高度))
并将宽度设置为要包装的宽度。我认为在您的情况下,它将设置为MaximumSize(…)

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

要获取首选宽度,您必须从父级之一获取宽度。同样,根据布局管理器的不同,您可能必须获取首选宽度、最大宽度或getSize()。getWidth().在不了解更多布局的情况下,很难说你到底需要做什么,但你确实需要在标签上设置某种宽度以便包装-这是没有办法的


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

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


您可以使用自定义荧光笔为文本“加下划线”。然后根据需要添加/删除荧光笔。可以开始使用。

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

你可以使用一个自定义的荧光笔在文本下划下划线。然后你只需根据需要添加/删除荧光笔。可以开始了