import java.awt.Color;
import java.awt.Cursor;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.net.URL;
import javax.swing.Action;
import javax.swing.ButtonModel;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.MetalButtonUI;
public class JLinkButton extends JButton {
private static final String uiString = "LinkButtonUI";
public static final int ALWAYS_UNDERLINE = 0;
public static final int HOVER_UNDERLINE = 1;
public static final int NEVER_UNDERLINE = 2;
public static final int SYSTEM_DEFAULT = 3;
private int linkBehavior;
private Color linkColor;
private Color colorPressed;
private Color visitedLinkColor;
private Color disabledLinkColor;
private URL buttonURL;
private Action defaultAction;
private boolean isLinkVisited;
public static void main(String[] a) {
JFrame f = new JFrame();
f.getContentPane().setLayout(new GridLayout(0,2));
f.getContentPane().add(new JLinkButton("www.rntsoft.com"));
f.getContentPane().add(new JLinkButton("www.rntsoft.com/ExampleCode/CatalogExampleCode.htm"));
f.setSize(600, 200);
f.setVisible(true);
}
public JLinkButton() {
this(null, null, null);
}
public JLinkButton(Action action) {
this();
setAction(action);
}
public JLinkButton(Icon icon) {
this(null, icon, null);
}
public JLinkButton(String s) {
this(s, null, null);
}
public JLinkButton(URL url) {
this(null, null, url);
}
public JLinkButton(String s, URL url) {
this(s, null, url);
}
public JLinkButton(Icon icon, URL url) {
this(null, icon, url);
}
public JLinkButton(String text, Icon icon, URL url) {
super(text, icon);
linkBehavior = SYSTEM_DEFAULT;
linkColor = Color.blue;
colorPressed = Color.red;
visitedLinkColor = new Color(128, 0, 128);
if (text == null && url != null)
setText(url.toExternalForm());
setLinkURL(url);
setCursor(Cursor.getPredefinedCursor(12));
setBorderPainted(false);
setContentAreaFilled(false);
setRolloverEnabled(true);
addActionListener(defaultAction);
}
public void updateUI() {
setUI(BasicLinkButtonUI.createUI(this));
}
private void setDefault() {
UIManager.getDefaults().put("LinkButtonUI", "BasicLinkButtonUI");
}
public String getUIClassID() {
return "LinkButtonUI";
}
protected void setupToolTipText() {
String tip = null;
if (buttonURL != null)
tip = buttonURL.toExternalForm();
setToolTipText(tip);
}
public void setLinkBehavior(int bnew) {
checkLinkBehaviour(bnew);
int old = linkBehavior;
linkBehavior = bnew;
firePropertyChange("linkBehavior", old, bnew);
repaint();
}
private void checkLinkBehaviour(int beha) {
if (beha != ALWAYS_UNDERLINE && beha != HOVER_UNDERLINE
&& beha != NEVER_UNDERLINE && beha != SYSTEM_DEFAULT)
throw new IllegalArgumentException("Not a legal LinkBehavior");
else
return;
}
public int getLinkBehavior() {
return linkBehavior;
}
public void setLinkColor(Color color) {
Color colorOld = linkColor;
linkColor = color;
firePropertyChange("linkColor", colorOld, color);
repaint();
}
public Color getLinkColor() {
return linkColor;
}
public void setActiveLinkColor(Color colorNew) {
Color colorOld = colorPressed;
colorPressed = colorNew;
firePropertyChange("activeLinkColor", colorOld, colorNew);
repaint();
}
public Color getActiveLinkColor() {
return colorPressed;
}
public void setDisabledLinkColor(Color color) {
Color colorOld = disabledLinkColor;
disabledLinkColor = color;
firePropertyChange("disabledLinkColor", colorOld, color);
if (!isEnabled())
repaint();
}
public Color getDisabledLinkColor() {
return disabledLinkColor;
}
public void setVisitedLinkColor(Color colorNew) {
Color colorOld = visitedLinkColor;
visitedLinkColor = colorNew;
firePropertyChange("visitedLinkColor", colorOld, colorNew);
repaint();
}
public Color getVisitedLinkColor() {
return visitedLinkColor;
}
public URL getLinkURL() {
return buttonURL;
}
public void setLinkURL(URL url) {
URL urlOld = buttonURL;
buttonURL = url;
setupToolTipText();
firePropertyChange("linkURL", urlOld, url);
revalidate();
repaint();
}
public void setLinkVisited(boolean flagNew) {
boolean flagOld = isLinkVisited;
isLinkVisited = flagNew;
firePropertyChange("linkVisited", flagOld, flagNew);
repaint();
}
public boolean isLinkVisited() {
return isLinkVisited;
}
public void setDefaultAction(Action actionNew) {
Action actionOld = defaultAction;
defaultAction = actionNew;
firePropertyChange("defaultAction", actionOld, actionNew);
}
public Action getDefaultAction() {
return defaultAction;
}
protected String paramString() {
String str;
if (linkBehavior == ALWAYS_UNDERLINE)
str = "ALWAYS_UNDERLINE";
else if (linkBehavior == HOVER_UNDERLINE)
str = "HOVER_UNDERLINE";
else if (linkBehavior == NEVER_UNDERLINE)
str = "NEVER_UNDERLINE";
else
str = "SYSTEM_DEFAULT";
String colorStr = linkColor == null ? "" : linkColor.toString();
String colorPressStr = colorPressed == null ? "" : colorPressed
.toString();
String disabledLinkColorStr = disabledLinkColor == null ? ""
: disabledLinkColor.toString();
String visitedLinkColorStr = visitedLinkColor == null ? ""
: visitedLinkColor.toString();
String buttonURLStr = buttonURL == null ? "" : buttonURL.toString();
String isLinkVisitedStr = isLinkVisited ? "true" : "false";
return super.paramString() + ",linkBehavior=" + str + ",linkURL="
+ buttonURLStr + ",linkColor=" + colorStr + ",activeLinkColor="
+ colorPressStr + ",disabledLinkColor=" + disabledLinkColorStr
+ ",visitedLinkColor=" + visitedLinkColorStr
+ ",linkvisitedString=" + isLinkVisitedStr;
}
}
class BasicLinkButtonUI extends MetalButtonUI {
private static final BasicLinkButtonUI ui = new BasicLinkButtonUI();
public BasicLinkButtonUI() {
}
public static ComponentUI createUI(JComponent jcomponent) {
return ui;
}
protected void paintText(Graphics g, JComponent com, Rectangle rect,
String s) {
JLinkButton bn = (JLinkButton) com;
ButtonModel bnModel = bn.getModel();
Color color = bn.getForeground();
Object obj = null;
if (bnModel.isEnabled()) {
if (bnModel.isPressed())
bn.setForeground(bn.getActiveLinkColor());
else if (bn.isLinkVisited())
bn.setForeground(bn.getVisitedLinkColor());
else
bn.setForeground(bn.getLinkColor());
} else {
if (bn.getDisabledLinkColor() != null)
bn.setForeground(bn.getDisabledLinkColor());
}
super.paintText(g, com, rect, s);
int behaviour = bn.getLinkBehavior();
boolean drawLine = false;
if (behaviour == JLinkButton.HOVER_UNDERLINE) {
if (bnModel.isRollover())
drawLine = true;
} else if (behaviour == JLinkButton.ALWAYS_UNDERLINE || behaviour == JLinkButton.SYSTEM_DEFAULT)
drawLine = true;
if (!drawLine)
return;
FontMetrics fm = g.getFontMetrics();
int x = rect.x + getTextShiftOffset();
int y = (rect.y + fm.getAscent() + fm.getDescent() + getTextShiftOffset()) - 1;
if (bnModel.isEnabled()) {
g.setColor(bn.getForeground());
g.drawLine(x, y, (x + rect.width) - 1, y);
} else {
g.setColor(bn.getBackground().brighter());
g.drawLine(x, y, (x + rect.width) - 1, y);
}
}
}