You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:47:14