Java 如何在 JLabel 中添加超链接?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/527719/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to add hyperlink in JLabel?
提问by amit
What is the best way to add a hyperlink in a JLabel? I can get the view using html tags, but how to open the browser when the user clicks on it?
在 JLabel 中添加超链接的最佳方法是什么?我可以使用 html 标签获取视图,但是当用户单击它时如何打开浏览器?
采纳答案by McDowell
You can do this using a JLabel
, but an alternative would be to style a JButton
. That way, you don't have to worry about accessibilityand can just fire events using an ActionListener
.
您可以使用 a 来执行此操作JLabel
,但另一种方法是设置 a 样式JButton
。这样,您就不必担心可访问性,只需使用ActionListener
.
public static void main(String[] args) throws URISyntaxException {
final URI uri = new URI("http://java.sun.com");
class OpenUrlAction implements ActionListener {
@Override public void actionPerformed(ActionEvent e) {
open(uri);
}
}
JFrame frame = new JFrame("Links");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 400);
Container container = frame.getContentPane();
container.setLayout(new GridBagLayout());
JButton button = new JButton();
button.setText("<HTML>Click the <FONT color=\"#000099\"><U>link</U></FONT>"
+ " to go to the Java website.</HTML>");
button.setHorizontalAlignment(SwingConstants.LEFT);
button.setBorderPainted(false);
button.setOpaque(false);
button.setBackground(Color.WHITE);
button.setToolTipText(uri.toString());
button.addActionListener(new OpenUrlAction());
container.add(button);
frame.setVisible(true);
}
private static void open(URI uri) {
if (Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(uri);
} catch (IOException e) { /* TODO: error handling */ }
} else { /* TODO: error handling */ }
}
回答by Srikanth
If <a href="link"> doesn't work, then:
如果 <a href="link"> 不起作用,则:
- Create a JLabel and add a MouseListener (decorate the label to look like a hyperlink)
- Implement mouseClicked()event
- In the implementation of mouseClicked() event, perform your action
- 创建一个 JLabel 并添加一个 MouseListener(将标签装饰成一个超链接)
- 实现mouseClicked()事件
- 在mouseClicked()事件的实现中,执行你的动作
Have a look at java.awt.DesktopAPI for opening a link using the default browser (this API is available only from Java6).
查看java.awt.DesktopAPI 以使用默认浏览器打开链接(此 API 仅适用于 Java6)。
回答by Kaarel
回答by dimo414
UpdateI've tidied up the SwingLink
class further and added more features; an up-to-date copy of it can be found here: https://bitbucket.org/dimo414/jgrep/src/tip/src/grep/SwingLink.java
更新我SwingLink
进一步整理了课程并添加了更多功能;可以在此处找到它的最新副本:https: //bitbucket.org/dimo414/jgrep/src/tip/src/grep/SwingLink.java
@McDowell's answer is great, but there's several things that could be improved upon. Notably text other than the hyperlink is clickable and it still looks like a button even though some of the styling has been changed/hidden. While accessibility is important, a coherent UI is as well.
@McDowell 的回答很好,但有几件事可以改进。值得注意的是,超链接以外的文本是可点击的,即使某些样式已更改/隐藏,它仍然看起来像一个按钮。虽然可访问性很重要,但连贯的 UI 也很重要。
So I put together a class extending JLabel based on McDowell's code. It's self-contained, handles errors properly, and feels more like a link:
所以我根据 McDowell 的代码组合了一个扩展 JLabel 的类。它是独立的,正确处理错误,感觉更像是一个链接:
public class SwingLink extends JLabel {
private static final long serialVersionUID = 8273875024682878518L;
private String text;
private URI uri;
public SwingLink(String text, URI uri){
super();
setup(text,uri);
}
public SwingLink(String text, String uri){
super();
setup(text,URI.create(uri));
}
public void setup(String t, URI u){
text = t;
uri = u;
setText(text);
setToolTipText(uri.toString());
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
open(uri);
}
public void mouseEntered(MouseEvent e) {
setText(text,false);
}
public void mouseExited(MouseEvent e) {
setText(text,true);
}
});
}
@Override
public void setText(String text){
setText(text,true);
}
public void setText(String text, boolean ul){
String link = ul ? "<u>"+text+"</u>" : text;
super.setText("<html><span style=\"color: #000099;\">"+
link+"</span></html>");
this.text = text;
}
public String getRawText(){
return text;
}
private static void open(URI uri) {
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
try {
desktop.browse(uri);
} catch (IOException e) {
JOptionPane.showMessageDialog(null,
"Failed to launch the link, your computer is likely misconfigured.",
"Cannot Launch Link",JOptionPane.WARNING_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(null,
"Java is not able to launch links on your computer.",
"Cannot Launch Link", JOptionPane.WARNING_MESSAGE);
}
}
}
You could also, for instance, change the link color to purple after being clicked, if that seemed useful. It's all self contained, you simply call:
例如,您还可以在单击后将链接颜色更改为紫色,如果这看起来有用的话。这一切都是自包含的,您只需调用:
SwingLink link = new SwingLink("Java", "http://java.sun.com");
mainPanel.add(link);
回答by Edward Falk
You might try using a JEditorPane instead of a JLabel. This understands basic HTML and will send a HyperlinkEvent event to the HyperlinkListener you register with the JEditPane.
您可以尝试使用 JEditorPane 而不是 JLabel。它理解基本的 HTML,并将向您注册到 JEditPane 的 HyperlinkListener 发送一个 HyperlinkEvent 事件。
回答by Stefan
I'd like to offer yet another solution. It's similar to the already proposed ones as it uses HTML-code in a JLabel, and registers a MouseListener on it, but it also displays a HandCursor when you move the mouse over the link, so the look&feel is just like what most users would expect. If browsing is not supported by the platform, no blue, underlined HTML-link is created that could mislead the user. Instead, the link is just presented as plain text. This could be combined with the SwingLink class proposed by @dimo414.
我想提供另一种解决方案。它与已经提出的类似,因为它在 JLabel 中使用 HTML 代码,并在其上注册了一个 MouseListener,但是当您将鼠标移到链接上时,它还显示一个 HandCursor,因此外观和感觉就像大多数用户所期望的. 如果平台不支持浏览,则不会创建可能误导用户的蓝色带下划线的 HTML 链接。相反,该链接仅显示为纯文本。这可以与@dimo414 提出的 SwingLink 类结合使用。
public class JLabelLink extends JFrame {
private static final String LABEL_TEXT = "For further information visit:";
private static final String A_VALID_LINK = "http://stackoverflow.com";
private static final String A_HREF = "<a href=\"";
private static final String HREF_CLOSED = "\">";
private static final String HREF_END = "</a>";
private static final String HTML = "<html>";
private static final String HTML_END = "</html>";
public JLabelLink() {
setTitle("HTML link via a JLabel");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));
JLabel label = new JLabel(LABEL_TEXT);
contentPane.add(label);
label = new JLabel(A_VALID_LINK);
contentPane.add(label);
if (isBrowsingSupported()) {
makeLinkable(label, new LinkMouseListener());
}
pack();
}
private static void makeLinkable(JLabel c, MouseListener ml) {
assert ml != null;
c.setText(htmlIfy(linkIfy(c.getText())));
c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
c.addMouseListener(ml);
}
private static boolean isBrowsingSupported() {
if (!Desktop.isDesktopSupported()) {
return false;
}
boolean result = false;
Desktop desktop = java.awt.Desktop.getDesktop();
if (desktop.isSupported(Desktop.Action.BROWSE)) {
result = true;
}
return result;
}
private static class LinkMouseListener extends MouseAdapter {
@Override
public void mouseClicked(java.awt.event.MouseEvent evt) {
JLabel l = (JLabel) evt.getSource();
try {
URI uri = new java.net.URI(JLabelLink.getPlainLink(l.getText()));
(new LinkRunner(uri)).execute();
} catch (URISyntaxException use) {
throw new AssertionError(use + ": " + l.getText()); //NOI18N
}
}
}
private static class LinkRunner extends SwingWorker<Void, Void> {
private final URI uri;
private LinkRunner(URI u) {
if (u == null) {
throw new NullPointerException();
}
uri = u;
}
@Override
protected Void doInBackground() throws Exception {
Desktop desktop = java.awt.Desktop.getDesktop();
desktop.browse(uri);
return null;
}
@Override
protected void done() {
try {
get();
} catch (ExecutionException ee) {
handleException(uri, ee);
} catch (InterruptedException ie) {
handleException(uri, ie);
}
}
private static void handleException(URI u, Exception e) {
JOptionPane.showMessageDialog(null, "Sorry, a problem occurred while trying to open this link in your system's standard browser.", "A problem occured", JOptionPane.ERROR_MESSAGE);
}
}
private static String getPlainLink(String s) {
return s.substring(s.indexOf(A_HREF) + A_HREF.length(), s.indexOf(HREF_CLOSED));
}
//WARNING
//This method requires that s is a plain string that requires
//no further escaping
private static String linkIfy(String s) {
return A_HREF.concat(s).concat(HREF_CLOSED).concat(s).concat(HREF_END);
}
//WARNING
//This method requires that s is a plain string that requires
//no further escaping
private static String htmlIfy(String s) {
return HTML.concat(s).concat(HTML_END);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JLabelLink().setVisible(true);
}
});
}
}
回答by ibrabelware
I wrote an article on how to set a hyperlink or a mailto on a jLabel.
我写了一篇关于如何在 jLabel 上设置超链接或 mailto 的文章。
So just try it:
所以试试吧:
I think that's exactly what you're searching for.
我认为这正是你正在寻找的。
Here's the complete code example :
这是完整的代码示例:
/**
* Example of a jLabel Hyperlink and a jLabel Mailto
*/
import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.EventQueue;
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.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
*
* @author ibrabelware
*/
public class JLabelLink extends JFrame {
private JPanel pan;
private JLabel contact;
private JLabel website;
/**
* Creates new form JLabelLink
*/
public JLabelLink() {
this.setTitle("jLabelLinkExample");
this.setSize(300, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
pan = new JPanel();
contact = new JLabel();
website = new JLabel();
contact.setText("<html> contact : <a href=\"\">[email protected]</a></html>");
contact.setCursor(new Cursor(Cursor.HAND_CURSOR));
website.setText("<html> Website : <a href=\"\">http://www.google.com/</a></html>");
website.setCursor(new Cursor(Cursor.HAND_CURSOR));
pan.add(contact);
pan.add(website);
this.setContentPane(pan);
this.setVisible(true);
sendMail(contact);
goWebsite(website);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/*
* Create and display the form
*/
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new JLabelLink().setVisible(true);
}
});
}
private void goWebsite(JLabel website) {
website.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
Desktop.getDesktop().browse(new URI("http://www.google.com/webhp?nomo=1&hl=fr"));
} catch (URISyntaxException | IOException ex) {
//It looks like there's a problem
}
}
});
}
private void sendMail(JLabel contact) {
contact.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
Desktop.getDesktop().mail(new URI("mailto:[email protected]?subject=TEST"));
} catch (URISyntaxException | IOException ex) {
//It looks like there's a problem
}
}
});
}
}
回答by Meshulam Silk
I know I'm kinda late to the party but I made a little method others might find cool/useful.
我知道我参加聚会有点晚了,但我做了一个其他人可能会觉得很酷/有用的小方法。
public static JLabel linkify(final String text, String URL, String toolTip)
{
URI temp = null;
try
{
temp = new URI(URL);
}
catch (Exception e)
{
e.printStackTrace();
}
final URI uri = temp;
final JLabel link = new JLabel();
link.setText("<HTML><FONT color=\"#000099\">"+text+"</FONT></HTML>");
if(!toolTip.equals(""))
link.setToolTipText(toolTip);
link.setCursor(new Cursor(Cursor.HAND_CURSOR));
link.addMouseListener(new MouseListener()
{
public void mouseExited(MouseEvent arg0)
{
link.setText("<HTML><FONT color=\"#000099\">"+text+"</FONT></HTML>");
}
public void mouseEntered(MouseEvent arg0)
{
link.setText("<HTML><FONT color=\"#000099\"><U>"+text+"</U></FONT></HTML>");
}
public void mouseClicked(MouseEvent arg0)
{
if (Desktop.isDesktopSupported())
{
try
{
Desktop.getDesktop().browse(uri);
}
catch (Exception e)
{
e.printStackTrace();
}
}
else
{
JOptionPane pane = new JOptionPane("Could not open link.");
JDialog dialog = pane.createDialog(new JFrame(), "");
dialog.setVisible(true);
}
}
public void mousePressed(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
});
return link;
}
It'll give you a JLabel that acts like a proper link.
它会给你一个 JLabel,就像一个正确的链接。
In action:
在行动:
public static void main(String[] args)
{
JFrame frame = new JFrame("Linkify Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 100);
frame.setLocationRelativeTo(null);
Container container = frame.getContentPane();
container.setLayout(new GridBagLayout());
container.add(new JLabel("Click "));
container.add(linkify("this", "http://facebook.com", "Facebook"));
container.add(new JLabel(" link to open Facebook."));
frame.setVisible(true);
}
If you'd like no tooltip just send a null.
如果您不想要工具提示,只需发送一个空值。
Hope someone finds this useful! (If you do, be sure to let me know, I'd be happy to hear.)
希望有人觉得这很有用!(如果你这样做,一定要让我知道,我很高兴听到。)
回答by Elist
Use a JEditorPane
with a HyperlinkListener
.
将 aJEditorPane
与HyperlinkListener
.
回答by thisis fake
Just put window.open(website url)
, it works every time.
只是说window.open(website url)
,它每次都有效。