可能很多人不知道,Swing其实可以添加html代码的,利用这个特性,我们可以用Label做很多奇特效果,例如可以做一个带超链接的label
import java.awt.Color; import java.awt.Cursor; import java.awt.Desktop; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import javax.swing.JLabel; /** * * 超链接文本标签类 * @author liuxing * */ public class LinkLabel extends JLabel { private static final long serialVersionUID = 1L; /** 超链接显示的文字 */ private String text; /** 保存连接 */ private URL link = null; /** 保存标签的默认颜色 */ private Color preColor = null; /** * 构造一个超链接 * @param vText 显示的文字 * @param vLink 连接地址 */ public LinkLabel(String vText, String vLink) { super("<html>" + vText + "</html>"); this.text = vText; try { if (!vLink.startsWith("http://")) vLink = "http://" + vLink; this.link = new URL(vLink); } catch (MalformedURLException err) { err.printStackTrace(); } this.addMouseListener(new MouseAdapter() { @Override public void mouseExited(MouseEvent e) { LinkLabel.this.setCursor(Cursor .getPredefinedCursor(Cursor.DEFAULT_CURSOR)); if (preColor != null) LinkLabel.this.setForeground(preColor); LinkLabel.this.setText("<html>" + text + "</html>"); } @Override public void mouseEntered(MouseEvent e) { LinkLabel.this.setCursor(Cursor .getPredefinedCursor(Cursor.HAND_CURSOR)); preColor = LinkLabel.this.getForeground(); LinkLabel.this.setForeground(Color.BLUE); LinkLabel.this.setText("<html><u>" + text + "</u></html>"); } @Override public void mouseClicked(MouseEvent e) { try { Desktop.getDesktop().browse(link.toURI()); } catch (IOException err) { err.printStackTrace(); } catch (URISyntaxException err) { err.printStackTrace(); } } }); } }
上面的这个类在实例化的时候传入显示值和链接即可用。
public LinkLabel(String vText, String vLink) {
...
}
我们可以看到,这个类添加了3个鼠标事件。鼠标移入事件、鼠标移除事件、鼠标点击事件:
鼠标移入事件:
@Override public void mouseEntered(MouseEvent e) { LinkLabel.this.setCursor(Cursor .getPredefinedCursor(Cursor.HAND_CURSOR)); preColor = LinkLabel.this.getForeground(); LinkLabel.this.setForeground(Color.BLUE); LinkLabel.this.setText("<html><u>" + text + "</u></html>"); }
鼠标移入时,把光标设置成手状,把文字颜色设置为蓝色,然后文字添加下划线。
鼠标移出事件:
@Override public void mouseExited(MouseEvent e) { LinkLabel.this.setCursor(Cursor .getPredefinedCursor(Cursor.DEFAULT_CURSOR)); if (preColor != null) LinkLabel.this.setForeground(preColor); LinkLabel.this.setText("<html>" + text + "</html>"); }
光标形状还原,颜色还原,文字下划线取消。
鼠标单击事件:
@Override public void mouseClicked(MouseEvent e) { try { Desktop.getDesktop().browse(link.toURI()); } catch (IOException err) { err.printStackTrace(); } catch (URISyntaxException err) { err.printStackTrace(); } }
直接调用系统提供的api,打开默认浏览器打开网站。
这就是超链接label的简单实现。
最后介绍个学习网站:Here