JToolTip是指当鼠标停留在一个控件上时显示的一个包含相关信息的方框,其中可以使用setToolTipText()方法来设置其中的内容,这里可以使用HTML语言来实现更多的效果(换行、表格、图片等),显示内容还是很多的。下面是JDK源代码:
public void setToolTipText(String text) {
String oldText = getToolTipText();
putClientProperty(TOOL_TIP_TEXT_KEY, text);
ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
if (text != null) {
if (oldText == null) {
toolTipManager.registerComponent(this);
}
} else {
toolTipManager.unregisterComponent(this);
}
}
从上面代码可以看出,这里有一个putClientProperty方法,用来设置TOOL_TIP_TEXT_KEY的属性值为text(这好像是个哈希表的样子)。oldText先从getToolTipText()方法中取,如果取到的是空的(null)并且传进来的text不为空,就注册给这个组件一个ToolTip。
这个控件是非常有用的,其中String getToolTipText(MouseEvent)是每个JComponent都实现的方法,用来获取JToolTip控件显示的内容,此方法默认JDK代码为:
public String getToolTipText() {
return (String)getClientProperty(TOOL_TIP_TEXT_KEY);
}
就是从TOOL_TIP_TEXT_KEY属性把值取出来作为返回值。在ToolTipManager的show方法中,就有这样一句:
toolTipText = insideComponent.getToolTipText();
这样就说明了如果组件重载了getToolTipText()方法,就可以在显示ToolTip的时候指定内容了。如果要在控件的不同位置显示不同的ToolTip,要重载public String getToolTipText(MouseEvent event)方法,下面是ToolTipManager类处理鼠标移动的代码:
public void mouseMoved(MouseEvent event) {
if (tipShowing) {
checkForTipChange(event);
}
else if (showImmediately) {
JComponent component = (JComponent)event.getSource();
toolTipText = component.getToolTipText(event);
if (toolTipText != null) {
preferredLocation = component.getToolTipLocation(event);
mouseEvent = event;
insideComponent = component;
exitTimer.stop();
showTipWindow();
}
}
else {
// Lazily lookup the values from within insideTimerAction
insideComponent = (JComponent)event.getSource();
mouseEvent = event;
toolTipText = null;
enterTimer.restart();
}
}
加亮显示的就是使用了重载方法的地方(还有其他一些地方,这里没全列)。
上面的逻辑可能有些混乱,主要是说几个类之间的关系(JComponent、JToolTip和ToolTipManager三个类),如果要利用SWING显示ToolTip,可以对上面的类方法进行重载或对类进行继承来达到自己所需要的效果。例如:
private class TipPanel extends JPanel
{
public TipPanel()
{
this.setSize(300, 300);
this.setBorder(new javax.swing.border.SoftBevelBorder (javax.swing.border.BevelBorder.RAISED));
}
public String getToolTipText(MouseEvent event)
{
return event.getPoint().toString();
}
}
就重载了JComponent的getToolTipText(MouseEvent)方法,这样就可以在此JPanel中移动鼠标的时候看到提示框中的变化了。