所以,你需要在你的Swing应用程序的简单的点击网址JLabel的吗?当然,你可以使用第三方库,做到这一点,但为什么添加另一个依赖一个单一的组件时,可以很容易地在5分钟内写一个。那么我们希望这个JLabel的:一下就可以了,去一个URL有鼠标上的手形光标就像一个真正的链接文本加以强调
,我们将写一个类,扩展JLabel和一个鼠标适配器,将采取开放链接的照顾。当鼠标适配器将只用于此标签,我们将添加一个私有成员类。这里是代码:package insidecoding.swing
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;
import javax.swing.JLabel;
/**
*
* @author ludovicianul
*/
public class URLLabel extends JLabel {
private String url;
public URLLabel() {
this("","");
}
public URLLabel(String label, String url) {
super(label);
this.url = url;
setForeground(Color.BLUE.darker());
setCursor(
new Cursor(Cursor.HAND_CURSOR));
addMouseListener(
new URLOpenAdapter());
}
public void setURL(String url) {
this.url = url;
}
//this is used to underline the text
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.blue);
Insets insets = getInsets();
int left = insets.left;
if (getIcon() != null) {
left += getIcon().getIconWidth() + getIconTextGap();
}
g.drawLine(left, getHeight() - 1 - insets.bottom,
(int) getPreferredSize().getWidth()
- insets.right, getHeight() - 1 - insets.bottom);
}
private class URLOpenAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if (Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(new URI(url));
} catch (Throwable t) {
//
}
}
}
}
}
我认为代码是不言自明:在构造函数中,我们设置标签颜色较深的蓝色,我们设置了光标鼠标手形光标,我们注册的点击鼠标监听器我们使用的paint()方法,强调标签的文本。鼠标适配器使用打开浏览器的桌面类。此代码来处理这些异常,不开放的URL时;这取决于对方案的需求。
,我们可以添加额外的功能如变色,一旦链接被点击一次工作会议。要做到这一点,我们添加一个私有布尔变量,将持有的点击状态,改变涂料的方法来考虑这个标志,并标记为true时,标签被点击:{C}
此外,标签的颜色和点击的颜色变量。我们声明了2个新的成员变量:normalColor和clickedColor,我们宣布另一个构造函数,我们可以把它们作为参数:private Color clickedColor = Color.black;
private Color normalColor = Color.BLUE.darker();
public URLLabel(String label, String url, Color clickedColor, Color normalColor) {
this(label, url);
this.clickedColor = clickedColor;
this.normalColor = normalColor;
}
如果您有任何问题,请在下面留下评论。