GraphicValidationDecoration提示框被控件提示框遮挡,如何提升优先级?
问题:控件Tooltip遮挡验证装饰提示框,如何设置优先级?
我在项目中使用ControlsFX的验证装饰功能,遇到一个问题——当控件自带Tooltip时,GraphicValidationDecoration的提示框会被控件的Tooltip完全遮挡,想知道怎么给验证装饰的提示框设置更高的优先级。
代码示例
package de.oowv.application; import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.TextField; import javafx.scene.control.Tooltip; import javafx.scene.layout.VBox; import javafx.stage.Stage; import org.controlsfx.validation.ValidationResult; import org.controlsfx.validation.ValidationSupport; import org.controlsfx.validation.decoration.GraphicValidationDecoration; public class Tmp extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { TextField text = new TextField(); text.setTooltip(new Tooltip("Text tooltip")); VBox root = new VBox(10, text); root.setPadding(new Insets(20)); ValidationSupport vs = new ValidationSupport(); vs.setValidationDecorator(new GraphicValidationDecoration()); vs.registerValidator(text, false, (c, v) -> ValidationResult.fromError(c, "Error")); text.setText("MMm"); primaryStage.setScene(new Scene(root, 300, 100)); primaryStage.show(); } }
效果说明
- 当前效果:控件的Tooltip完全覆盖在验证图标上方,看不到验证提示框
- 期望效果:验证提示框显示在验证装饰图标上方,不会被控件Tooltip遮挡
解决方案
核心思路是自定义GraphicValidationDecoration,修改验证提示框的显示逻辑,让它能优先于控件自带Tooltip显示。
方法一:自定义装饰类调整Tooltip属性
通过重写createTooltip方法,设置验证提示框的显示延迟为0,并提升其层级,让它更快、更优先地显示:
import org.controlsfx.validation.decoration.GraphicValidationDecoration; import javafx.scene.control.Tooltip; import javafx.util.Duration; public class PriorityValidationDecoration extends GraphicValidationDecoration { @Override protected Tooltip createTooltip(String text) { Tooltip tooltip = super.createTooltip(text); // 设置验证提示框立即触发显示,比控件Tooltip更快响应 tooltip.setShowDelay(Duration.ZERO); // 提升提示框的显示层级,避免被遮挡 tooltip.setStyle("-fx-z-index: 9999;"); return tooltip; } }
在原代码中替换装饰类:
ValidationSupport vs = new ValidationSupport(); vs.setValidationDecorator(new PriorityValidationDecoration()); // 替换为自定义装饰类 vs.registerValidator(text, false, (c, v) -> ValidationResult.fromError(c, "Error"));
方法二:通过事件监听临时禁用控件Tooltip
当鼠标悬停在验证图标上时,暂时禁用控件的Tooltip,离开后恢复,确保验证提示能正常显示:
// 遍历TextField的子节点,找到验证图标 text.getChildrenUnmodifiable().stream() .filter(node -> node.getStyleClass().contains("error-icon")) .forEach(icon -> { icon.setOnMouseEntered(e -> text.getTooltip().setDisable(true)); icon.setOnMouseExited(e -> text.getTooltip().setDisable(false)); });
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

