當事件發生時,要求程式畫出一個文字欄位,把 tool tip 要顯示的東西放在欄位上。
範例的滑鼠停留事件可以參考 [1]。
以下先節錄 [1] 定義的 tool tip 事件的 class。
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.HelpEvent;
import org.eclipse.swt.events.HelpListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.Widget;
/**
* Emulated tooltip handler Notice that we could display anything in a tooltip
* besides text and images. For instance, it might make sense to embed large
* tables of data or buttons linking data under inspection to material
* elsewhere, or perform dynamic lookup for creating tooltip text on the fly.
* @author http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/HowtoimplementhoverhelpfeedbackusingtheMouseTrackListener.htm
*/
public class ToolTipHandler {
private Shell parentShell;
private Shell tipShell;
private Label tipLabelImage, tipLabelText;
private Widget tipWidget; // widget this tooltip is hovering over
private Point tipPosition; // the position being hovered over
/**
* Creates a new tooltip handler
* @param parent
* the parent Shell
*/
public ToolTipHandler(Shell parent) {
final Display display = parent.getDisplay();
this.parentShell = parent;
tipShell = new Shell(parent, SWT.ON_TOP | SWT.TOOL);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.marginWidth = 2;
gridLayout.marginHeight = 2;
tipShell.setLayout(gridLayout);
tipShell.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
tipLabelImage = new Label(tipShell, SWT.NONE);
tipLabelImage.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
tipLabelImage.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
tipLabelImage.setLayoutData(
new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER));
tipLabelText = new Label(tipShell, SWT.NONE);
tipLabelText.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
tipLabelText.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
tipLabelText.setLayoutData(
new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER));
}
/**
* Enables customized hover help for a specified control
*
* @control the control on which to enable hoverhelp
*/
public void activateHoverHelp(final Control control) {
// Get out of the way if we attempt to activate the control underneath the tooltip
control.addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
if (tipShell.isVisible())
tipShell.setVisible(false);
}
});
// Trap hover events to pop-up tooltip
control.addMouseTrackListener(new MouseTrackAdapter() {
public void mouseExit(MouseEvent e) {
if (tipShell.isVisible())
tipShell.setVisible(false);
tipWidget = null;
}
public void mouseHover(MouseEvent event) {
Point pt = new Point(event.x, event.y);
Widget widget = event.widget;
if (widget instanceof ToolBar) {
ToolBar w = (ToolBar) widget;
widget = w.getItem(pt);
}
if (widget instanceof Table) {
Table w = (Table) widget;
widget = w.getItem(pt);
}
if (widget instanceof Tree) {
Tree w = (Tree) widget;
widget = w.getItem(pt);
}
if (widget == null) {
tipShell.setVisible(false);
tipWidget = null;
return;
}
if (widget == tipWidget)
return;
tipWidget = widget;
tipPosition = control.toDisplay(pt);
String text = (String) widget.getData("TIP_TEXT");
Image image = (Image) widget.getData("TIP_IMAGE");
tipLabelText.setText(text != null ? text : "");
tipLabelImage.setImage(image); // accepts null
tipShell.pack();
setHoverLocation(tipShell, tipPosition);
tipShell.setVisible(true);
}
});
// Trap F1 Help to pop up a custom help box
control.addHelpListener(new HelpListener() {
public void helpRequested(HelpEvent event) {
if (tipWidget == null)
return;
ToolTipHelpTextHandler handler = (ToolTipHelpTextHandler) tipWidget
.getData("TIP_HELPTEXTHANDLER");
if (handler == null)
return;
String text = handler.getHelpText(tipWidget);
if (text == null)
return;
if (tipShell.isVisible()) {
tipShell.setVisible(false);
Shell helpShell = new Shell(parentShell, SWT.SHELL_TRIM);
helpShell.setLayout(new FillLayout());
Label label = new Label(helpShell, SWT.NONE);
label.setText(text);
helpShell.pack();
setHoverLocation(helpShell, tipPosition);
helpShell.open();
}
}
});
}
/**
* Sets the location for a hovering shell
*
* @param shell
* the object that is to hover
* @param position
* the position of a widget to hover over
* @return the top-left location for a hovering box
*/
private void setHoverLocation(Shell shell, Point position) {
Rectangle displayBounds = shell.getDisplay().getBounds();
Rectangle shellBounds = shell.getBounds();
shellBounds.x = Math.max(
Math.min(position.x, displayBounds.width - shellBounds.width),
0);
shellBounds.y = Math.max(
Math.min(position.y + 16, displayBounds.height
- shellBounds.height), 0);
shell.setBounds(shellBounds);
}
/**
* ToolTip help handler
*/
public interface ToolTipHelpTextHandler {
/**
* Get help text
* @param widget
* the widget that is under help
* @return a help text string
*/
public String getHelpText(Widget widget);
}
}
接著當需要放 tool tip 時,可以加入以下的程式碼。
Shell shell = new Shell();
ToolTipHandler tooltipHandler = new ToolTipHandler(shell.getShell());
// Initial table and table item.
Table table = new Table(shell, SWT.BORDER);
TableItem item = new TableItem(table, SWT.PUSH);
// Set properties about tool tip.
item.setData("TIP_TEXT", "tool tip");
item.setData("TIP_HELPTEXTHANDLER", new ToolTipHelpTextHandler() {
public String getHelpText(Widget widget) {
Item item = (Item) widget;
return "tool tip"
}
});
// Activate the tool tip on the table. (Bind events for the Control object)
tooltipHandler.activateHoverHelp(table);
不過詳細的原理我還沒仔細看,所以暫時先不加註語法的解釋了。
需要其他的範例的話,可以直接參考 [1] 的原始碼,上面有好幾種介面的使用範例
並且在 [1] 的範例中,都是有在 tool tip 上放圖的。
PS. 不過要直接執行 [1] 的範例程式碼時,記得自己放 notification.gif 和 warning.gif 兩個圖檔!
參考資料:
1、How to implement hover help feedback using the MouseTrackListener
沒有留言:
張貼留言