TOOLTIP的使用
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中移動鼠標的時候看到提示框中的變化了。