我想在JPanel中插入超链接

时间:2011-04-18 13:27:59

标签: java user-interface hyperlink

我想在JPanel中插入超链接(以便在点击时转到网址)  可能吗 ? 如果是,我该怎么做?

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

我们一直在使用这样的东西:

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 />"));
}

}

答案 2 :(得分:1)

我写了一个简单的函数,它接受你想要显示的文本,链接和位置,并返回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;
}

如果代码的任何部分不清楚,请与我联系;)

答案 3 :(得分:0)

是的,

使用HTML

Add one JLabel use HTML as text并将其添加到Panel