Java FX TextField已禁用节点事件

Java FX TextField已禁用节点事件,java,css,swing,javafx,Java,Css,Swing,Javafx,我非常了解Java FX Node API,其中指出: 禁用的节点不接收鼠标或按键事件 所以,我正试图想出一个解决办法。在以前的Swing应用程序中,我们允许用户双击禁用的web/email字段(格式化的TextField),打开指向页面或其本机邮件客户端的链接。我希望在FX中模拟这种行为。而不是打电话: setDisable(true); 我现在打电话: setEditable(false); 剩下的唯一问题是,我希望将节点设置为禁用状态,或者至少禁用文本选择 当节点被禁用时,有没有一种简

我非常了解Java FX Node API,其中指出:

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

所以,我正试图想出一个解决办法。在以前的Swing应用程序中,我们允许用户双击禁用的web/email字段(格式化的TextField),打开指向页面或其本机邮件客户端的链接。我希望在FX中模拟这种行为。而不是打电话:

setDisable(true);
我现在打电话:

setEditable(false);
剩下的唯一问题是,我希望将节点设置为禁用状态,或者至少禁用文本选择

当节点被禁用时,有没有一种简单的方法来获得它的确切样式,或者我需要创建自己的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);
    }
}
当节点被禁用时,有没有一种简单的方法来获得它的确切样式,或者我需要创建自己的CSS类

如果对不可编辑的文本字段执行以下操作,它看起来与禁用的文本字段完全相同(在我的MacBook上测试)


textField.setStyle(“-fx不透明度:0.5”)

谢谢您的建议!这绝对是我们的想法,但是这些是在多个屏幕上使用的自定义组件。我想他们可以扩展StackPane而不是TextField,当设置/获取值时,我们可以只做pane.getTextField().getValue()。这可能是首选解决方案。您的自定义组件也可以只公开textField的
textProperty()
(以及其他需要的属性);i、 e.
publicstringproperty textProperty(){return textField.textProperty();}
,等等。