JavaFX 的工具提示 showDuration 不起作用
JavaFX's Tooltip showDuration doesn't work
我想在用户从 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
好像不行。它将永远显示。
我认为这就是你实现它的方式,我试过了并且对我有用
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);
如果这对您不起作用,请尝试通过提供您的代码片段来帮助我们帮助您,我可以在不添加任何内容的情况下对其进行测试
当您通过 Tooltip#install(Node,Tooltip)
1 安装 Tooltip
时,给定的 Node
添加了三个事件处理程序,都与鼠标相关事件。正是这些事件处理程序实现了 showDelay
和 showDuration
功能。这是通过使用 Timeline
s 在内部完成的。但是,当您通过其 show
方法之一手动显示 Tooltip
时,您可以完全绕过此行为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
绕过鼠标事件处理程序添加的所有功能。
我想在用户从 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
好像不行。它将永远显示。
我认为这就是你实现它的方式,我试过了并且对我有用
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);
如果这对您不起作用,请尝试通过提供您的代码片段来帮助我们帮助您,我可以在不添加任何内容的情况下对其进行测试
当您通过 Tooltip#install(Node,Tooltip)
1 安装 Tooltip
时,给定的 Node
添加了三个事件处理程序,都与鼠标相关事件。正是这些事件处理程序实现了 showDelay
和 showDuration
功能。这是通过使用 Timeline
s 在内部完成的。但是,当您通过其 show
方法之一手动显示 Tooltip
时,您可以完全绕过此行为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
绕过鼠标事件处理程序添加的所有功能。