我使用JLabels作为超链接。我希望他们看起来和浏览器中的链接完全一样,所以使用文本窗格/编辑器窗格等是不可取的。问题是许多这些链接将被放置的容器没有规定的大小:它们依赖于父母(甚至是祖父母)的大小。我使用Boxes进行布局,如果链接文本跨越盒子宽度的三分之二以上,则盒子内容开始伸展到盒子的实际边界之外(因此,如果该盒子被JScrollPane包围,会出现一个水平滚动条)。无首选/最大/最小大小的文本包装JLabels
有什么办法强制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
}
)
任何想法,将不胜感激。超链接类的代码如下。
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);
}
}
}