我使用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);
}
}
}