【问题标题】:FX TextField Disabled Node EventsFX TextField 禁用节点事件
【发布时间】:2015-06-02 13:23:26
【问题描述】:

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

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

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

setDisable(true);

我现在打电话:

setEditable(false);

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

是否有一种简单的方法可以在节点被禁用时获取它的确切样式,还是我需要创建自己的 CSS 类? (可惜我的 CSS 知识比较薄弱)。

【问题讨论】:

    标签: java css swing javafx


    【解决方案1】:

    如果不复制禁用文本字段的默认规则(但也许其他人对此有技巧),我看不到使用 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);
        }
    }
    

    【讨论】:

    • 感谢您的建议!这绝对是我们的想法,但是这些是在多个屏幕上使用的自定义组件。我猜他们可以只扩展 StackPane 而不是 TextField 并且在设置/获取值时我们可以只做 pane.getTextField().getValue() 。这可能最终成为首选解决方案。
    • 您的自定义组件也可以只公开文本字段的textProperty()(以及其他需要的属性);即public StringProperty textProperty() { return textField.textProperty(); }
    【解决方案2】:

    是否有一种简单的方法可以在节点被禁用时获取它的确切样式,还是我需要创建自己的 CSS 类?

    如果您对不可编辑的文本字段执行以下操作,它看起来就像一个禁用的文本字段(在我的 MacBook 上测试过)。

    textField.setStyle("-fx-opacity:0.5");

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2019-08-19
      • 1970-01-01
      相关资源
      最近更新 更多