Я использую JLabels в качестве гиперссылок.Я хочу, чтобы они выглядели и функционировали точно так же, как ссылки в браузере, поэтому использование текстовых панелей / панелей редактора и т. Д. Нежелательно.Проблема в том, что многие контейнеры, в которые будут помещены эти ссылки, не имеют указанного размера: они зависят от размера своих родителей (или даже бабушек и дедушек).
Я использую ящики для макетов,и если текст ссылки занимает более чем две трети ширины блока, содержимое блока начинает выходить за пределы реальных границ блока (так что, если этот блок был окружен 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);
}
}
}