JavaFX的工具提示showDuration不起作用

时间:2019-10-23 13:04:02

标签: java javafx tooltip

当用户从TextField中复制数据以通知他发生这种情况时,我想在TextField中显示工具提示。

public class TestController {
    @FXML private TextField textField;
    private final Clipboard clipboard;
    private ContextMenu menu;
    private MenuItem menuCopy;

    @FXML protected void initialize() {
        clipboard = Clipboard.getSystemClipboard();
        menu = new ContextMenu();

        menuCopy = new MenuItem("Copy");
        menuCopy.setOnAction(this::copy);

        textField.setContextMenu(menu);
    }

    private void copy(ActionEvent event) {
        final ClipboardContent content = new ClipboardContent();
        if(((TextField) menu.getUserData()).getSelectedText().length() == 0)
            content.putString(((TextField) menu.getUserData()).getText());
        else
            content.putString(((TextField) menu.getUserData()).getSelectedText());
        clipboard.setContent(content);

        Point2D p = ((TextField) menu.getUserData()).localToScreen(0,0);
        Tooltip test = new Tooltip("Copied");
        test.setShowDuration(new Duration(2000));
        test.show(((TextField) menu.getUserData()), p.getX(), p.getY());
    }
}

但是setShowDuration似乎不起作用。它将永远显示。

2 个答案:

答案 0 :(得分:6)

通过Tooltip#install(Node,Tooltip) 1 安装Tooltip时,将给给定的Node添加三个事件处理程序,它们均与鼠标事件有关。这些事件处理程序实现了showDelayshowDuration功能。这是通过使用Timeline在内部完成的。但是,当您通过一种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#tooltipTab#tooltip之类的设置属性也会委托给#install(Node,Tooltip)
2。即使已安装Tooltip,也是如此。手动调用show会绕过鼠标事件处理程序添加的所有功能。

答案 1 :(得分:1)

我认为这是您实施它的方式,我尝试过并且对我有用

PasswordField pf = new PasswordField();
Tooltip tooltip = new Tooltip("Your password must be\nat least 8 characters in length");
tooltip.setShowDuration(new Duration(2000));
pf.setTooltip(tooltip);

如果这不适用于您,请尝试提供无需测试即可添加的代码段,以帮助我们为您提供帮助