我正在使用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);
}
}
}
答案 0 :(得分:2)
在标签上,尝试setPreferredSize(new Dimension(width, height))
,setSize(new Dimension(width, height))
或setMaximumSize(new Dimension(width, height))
并将宽度设置为您希望其包裹的宽度。我认为在你的情况下它将是setMaximumSize(...)。
由于您的布局管理器,它不会自动换行。某些布局管理器将忽略首选大小或其他维度。在您的情况下,您可能只需要使用不同的setXXXSize()方法,并找到布局管理器所尊重的方法。
要获得首选宽度,您必须从其中一个父项获取宽度。再一次,根据布局管理器,您可能必须获得首选宽度,最大宽度或getSize()。getWidth()。在不了解布局的情况下,很难说你需要做多少才能做到这一点,但是你需要在标签上设置一些宽度来包装 - 没有办法解决这个问题。
我能想到的唯一另一个选择是将标签上的首选宽度设置为您知道应该始终适合可用空间的任意宽度。
答案 1 :(得分:1)
使用JTextArea。可以将文本设置为自动换行。您可以使用文本区域属性使其看起来像标签。
您可以使用自定义荧光笔来“加下划线”文字。然后根据需要添加/删除荧光笔。 Rectangle Painter可以帮助您入门。