FX TextField已禁用节点事件

时间:2015-06-02 13:23:26

标签: java css swing javafx

我很清楚Java FX Node API,它声明:

  

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

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

setDisable(true);

我现在正在打电话:

setEditable(false);

唯一剩下的问题是我想要将Node设置为已禁用,或者至少禁用文本选择。

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

2 个答案:

答案 0 :(得分:2)

我无法看到使用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);
    }
}

答案 1 :(得分:1)

  

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

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

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