我正在使用 Eclipse Jface 库开发一个 Java 项目,我的目标是当用户将鼠标悬停在 Jface TreeViewer 中的某个项目上时显示自定义工具提示。但是,我遇到了工具提示消失得太快的问题。我希望当用户将鼠标悬停在树中的某个项目上时它保持可见的时间更长。
我的代码在 Windows 中稳定,但在 Linux 中不稳定,我认为这是因为 gtk 我目前在 RH8 中,但之前在 Centos7 中。重要的是,之前我们使用的是旧版本的 jface 3.8.0,但我们已经在 Java 11 中进行了迁移,因此我们无法再使用它。请避免解决方案,因为我无法回滚依赖项版本。
我已经做了的是回滚到不同版本的jface,我已经尝试从3.27到3.15仍然有问题。 我尝试了不同的侦听器以及 MouseEnter 或 MouseMove,但没有成功。 我已经尝试设置一个大的隐藏层,但它没有做出任何改变
这是我的代码的一个例外,我尝试使用基本工具提示创建一个 TreeViewer:
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
public class BasicToolTipTreeViewerExample {
private Object hoverEvent = null;
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("TreeViewer avec ToolTip de Base");
shell.setSize(600, 400);
shell.setLayout(new FillLayout());
new BasicToolTipTreeViewerExample().createUI(shell);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private void createUI(Composite parent) {
TreeViewer viewer = new TreeViewer(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
viewer.getTree().setHeaderVisible(true);
TreeViewerColumn column = new TreeViewerColumn(viewer, SWT.NONE);
column.getColumn().setText("Nom de l'Événement");
column.getColumn().setWidth(300);
TreeItem rootItem = new TreeItem(viewer.getTree(), SWT.NONE);
rootItem.setText("Événements Principaux");
rootItem.setExpanded(true);
TreeItem eventItem1 = new TreeItem(rootItem, SWT.NONE);
eventItem1.setText("Événement 1");
eventItem1.setData("Détails de l'Événement 1");
TreeItem eventItem2 = new TreeItem(rootItem, SWT.NONE);
eventItem2.setText("Événement 2");
eventItem2.setData("Détails de l'Événement 2");
TreeItem eventItem3 = new TreeItem(rootItem, SWT.NONE);
eventItem3.setText("Événement 3");
eventItem3.setData("Détails de l'Événement 3");
createBasicToolTip(viewer);
}
private void createBasicToolTip(TreeViewer viewer) {
ToolTip tooltip = new ToolTip(viewer.getTree()) {
@Override
protected Composite createToolTipContentArea(Event event, Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_GRAY));
composite.setLayout(new FillLayout());
if (hoverEvent != null) {
String text = (String) hoverEvent;
if (text != null) {
Label label = new Label(composite, SWT.NONE);
label.setText(text);
label.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_GRAY));
}
}
return composite;
}
};
tooltip.setPopupDelay(500);
tooltip.setHideDelay(5000);
tooltip.setShift(new Point(-5, -5));
viewer.getTree().addListener(SWT.MouseHover, event -> {
Point point = new Point(event.x, event.y);
TreeItem item = viewer.getTree().getItem(point);
if (item == null || item.getData() == null) {
hoverEvent = null;
tooltip.hide();
} else {
hoverEvent = item.getData();
tooltip.show(new Point(event.x, event.y));
}
});
}
}
有没有办法让工具提示保持可见时间更长或防止它消失? 是否有我应该调整的任何其他参数,或者在 Jface 的 TreeViewer 中显示更持久的工具提示的不同方法?
问题实际上是函数中设置的工具提示的位置
tooltip.setShift(new Point(-5, -5));
使用这些参数,工具提示将在鼠标上弹出,这将与鼠标悬停侦听器发生碰撞,因为父级的小部件(TreeViewer)不在鼠标下方。
我将 setShift 更改为:
tooltip.setShift(new Point(-5, 15));