Я хочу вставить гиперссылку в JPanel - PullRequest
0 голосов
/ 18 апреля 2011

Я хочу вставить гиперссылку в JPanel (чтобы при нажатии перейти на веб-адрес) Является ли это возможным ? Если да, как я могу это сделать?

Ответы [ 4 ]

3 голосов
/ 18 апреля 2011
1 голос
/ 04 августа 2012

Я написал простую функцию, которая берет текст, ссылку и позицию, которую вы хотите отобразить, и возвращает JLabel. Когда мышь находится над текстом, она становится синей с подчеркиванием и делает курсор указывающей рукой, в противном случае она становится черной без подчеркивания и курсора по умолчанию.

    public static JLabel makeHyperLink(final String s, final String link, int x, int y)
{
    final JLabel l = new JLabel(s);
    l.addMouseListener(new MouseAdapter()
    {

        @Override
        public void mouseExited(MouseEvent arg0)
        {
            l.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            l.setText(s);
        }

        @Override
        public void mouseEntered(MouseEvent arg0)
        {
            l.setCursor(new Cursor(Cursor.HAND_CURSOR));
            l.setText(String.format("<HTML><FONT color = \"#000099\"><U>%s</U></FONT></HTML>", s));
        }

        @Override
        public void mouseClicked(MouseEvent arg0)
        {
            try
            {
                URI uri = new URI(link);
                if (Desktop.isDesktopSupported())
                    Desktop.getDesktop().browse(uri);
            } catch (Exception e)
            {
            }
        }
    });

    l.setBounds(x, y, s.length()*5, 20);
    l.setToolTipText(String.format("go to %s", link));
    return l;
}

Если какая-либо часть кода не понятна, свяжитесь со мной;)

1 голос
/ 18 апреля 2011

Мы использовали что-то вроде этого:

public class UrlTextPane extends JTextPane {

private final Pattern urlPattern = Pattern.compile(UrlUtil.URL_REGEX);

public UrlTextPane() {
    this.setEditable(false);
    this.addHyperlinkListener(new UrlHyperlinkListener());
    this.setContentType("text/html");
}

private class UrlHyperlinkListener implements HyperlinkListener {
    @Override
    public void hyperlinkUpdate(final HyperlinkEvent event) {
        if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
            try {
                Desktop.getDesktop().browse(event.getURL().toURI());
            } catch (final IOException e) {
                throw new RuntimeException("Can't open URL", e);
            } catch (final URISyntaxException e) {
                throw new RuntimeException("Can't open URL", e);
            }
        }
    }
};

@Override
/**
 * Set the text, first translate it into HTML:
 */
public void setText(final String input) {

    final StringBuilder answer = new StringBuilder();
    answer.append("<html><body style=\"font-size: 8.5px;font-family: Tahoma, sans-serif\">");

    final String content = StringEscapeUtils.escapeHtml(input);

    int lastIndex = 0;
    final Matcher matcher = urlPattern.matcher(content);
    while(matcher.find()) {
        //Append everything since last update to the url:
        answer.append(content.substring(lastIndex, matcher.start()));
        final String url = content.substring(matcher.start(), matcher.end()).trim();
        if(UrlUtil.isValidURI(url)) {
            answer.append("<a href=\"" + url + "\">"+url+"</a>");
        } else {
             answer.append(url);
        }
        lastIndex = matcher.end();
    }
    //Append end:
    answer.append(content.substring(lastIndex));
    answer.append("</body></html>");
    super.setText(answer.toString().replace("\n", "<br />"));
}

}

0 голосов
/ 18 апреля 2011

Да возможно,

Использование HTML

Добавьте один JLabel, используйте HTML в качестве текста и добавьте его в Panel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...