我很清楚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);
}
}