Tooltip -- 为MenuItem实现Tooltip
一、Node组件可以很容易的添加Tooltip
在JavaFX2中,Tooltip可以很容易的实现在所有的Node组件中,如:
Button button = new Button("Hover Over Me");
button.setTooltip(new Tooltip("Tooltip for Button"));
或者
Rectangle rect = new Rectangle(0, 0, 100, 100);
Tooltip t = new Tooltip("A Square");
Tooltip.install(rect, t);
可是有些特殊的组件并继承于Node,比如MenuItem。
二、有两种办法为MenuItem实现Tooltip
1 使用CustomMenuItem类,它允许封装任意的Node作为显示内容,此时为具体的Node添加Tooltip即可。
这个方法会比较麻烦,需要先定义一个通用的CustomMenuItem菜单项,但是这样一来原本值需要为MenuItem定义的CSS现在要重新修改了
2 响应MenuItem的激活和取消显示事件
在鼠标移到某个菜单项上面时,就会响应MenuValidation事件,此时显示Tooltip
在鼠标移到其他菜单项时,会触发其他菜单项的MenuValidation事件,Tooltip会刷新
在菜单消失时,会触发Hidden事件,此时隐藏Tooltip
见下面的代码:
curMenu.setOnMenuValidation(new EventHandler<Event>() {
@Override
public void handle(Event t) {
String help = "This is tooltip!";
if (tooltip == null) {
tooltip = new Tooltip();
tooltip.setWrapText(true);
tooltip.setTextAlignment(TextAlignment.LEFT);
tooltip.setPrefSize(200, 200);
tooltip.setMinSize(200, 100);
}
tooltip.setText(help);
Window window = target.getContextPane().getScene().getWindow();
double x = window.getX() + window.getWidth() - tooltip.getPrefWidth() - 50;
double y = window.getY() + 50;
tooltip.show(window, x, y);//将tooltip显示在Window的右上角
}
});
curMenu.setOnHidden(new EventHandler<Event>() {
@Override
public void handle(Event t) {
//这里所以菜单是共用的同一个tooltip
if (tooltip != null) {
tooltip.hide();
}
}
});
三、一些相关的网址
http://stackoverflow.com/questions/13927559/menuitem-tooltip-in-javafx2
http://stackoverflow.com/questions/11647080/how-to-properly-size-and-wrap-tooltips
http://docs.oracle.com/javafx/2/ui_controls/tooltip.htm
http://docs.oracle.com/javafx/2/api/index.html