我很清楚Java FX Node API指出:


  禁用的节点不接收鼠标或按键事件。


因此,我正在尝试解决。在旧的Swing应用程序中,我们曾经允许用户双击禁用的Web /电子邮件字段(“格式化的文本字段”)以打开指向页面或其本机邮件客户端的链接。我希望在FX中模拟这种行为。而不是调用:

setDisable(true);


我现在打电话给:

setEditable(false);


剩下的唯一问题是,我想给节点设置样式,就像禁用它一样,或者至少禁用文本选择。

当禁用Node时,是否有一种简单的方法来获取Node的确切样式,还是需要创建自己的CSS类? (不幸的是,我的CSS知识相对较弱)。

最佳答案

我看不到使用CSS做到这一点的“简便”方法,而没有为禁用的文本字段复制默认规则(但也许其他人对此有窍门)。

不过,这是一种完全不同的方法。禁用文本字段时,它不接收鼠标事件,因此任何鼠标事件都将按照Z顺序“直接”到达其下方的节点。因此,如果将文本字段包装在某个窗格中,然后在该窗格中注册一个鼠标处理程序,则在禁用文本字段的情况下将调用该鼠标处理程序。

SSCCE:

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class DIsabledTextFieldEventTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        TextField textField = new TextField();
        StackPane textFieldHolder = new StackPane(textField);

        CheckBox disableTextField = new CheckBox("Disable text field");
        textField.disableProperty().bind(disableTextField.selectedProperty());

        textFieldHolder.setOnMouseClicked(e -> {
            if (e.getClickCount() == 2) {
                System.out.println("Double click on disabled text field!");
            }
        });

        VBox root = new VBox(10, disableTextField, textFieldHolder);
        root.setAlignment(Pos.CENTER);

        Scene scene = new Scene(root, 350, 120);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

10-08 08:15
查看更多