Когда вы устанавливаете Tooltip
через Tooltip#install(Node,Tooltip)
1 , к данному Node
добавляются три обработчика событий, все они связаны с событиями мыши. Именно эти обработчики событий реализуют функции showDelay
и showDuration
. Это делается внутренне с помощью Timeline
s. Однако, когда вы вручную показываете Tooltip
с помощью одного из его show
методов, вы полностью игнорируете это поведение 2 . Другими словами, ваш Tooltip
имеет те же функции, что и любой другой PopupControl
.
Если вы хотите вручную отобразить Tooltip
и он исчезнет через определенное время, вам придетсяреализовать это самостоятельно. Вот подтверждение концепции :
import javafx.animation.PauseTransition;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.util.Duration;
public class NotifyingTextField extends TextField {
private final Tooltip tooltip = new Tooltip("Copied contents to clipboard");
private final PauseTransition hideAnimation = new PauseTransition();
{
hideAnimation.durationProperty().bind(tooltip.showDurationProperty());
hideAnimation.setOnFinished(e -> tooltip.hide());
tooltip.setShowDuration(Duration.seconds(2.0));
}
@Override
public void copy() {
var selectedText = getSelectedText();
if (!selectedText.isEmpty()) {
super.copy();
var point = localToScreen(0, 0);
tooltip.show(this, point.getX(), point.getY());
hideAnimation.playFromStart();
}
}
}
Конечно, вы можете найти стороннюю библиотеку, которая предлагает готовое решение.
1. Даже при установке таких свойств, как Control#tooltip
или Tab#tooltip
, будет делегировано значение #install(Node,Tooltip)
.
2. Это верно, даже если установлена Tooltip
. Вызов show
вручную обходит все функции, добавленные обработчиками событий мыши.