我很清楚Java FX Node API,它声明:
禁用的节点不会接收鼠标或键事件。
所以,我正试图想出一个解决方法。在我们的旧Swing应用程序中,我们曾经允许用户双击禁用的Web /电子邮件字段(Formatted TextField)以打开指向该页面或其本机邮件客户端的链接。我希望在FX中模拟这种行为。而不是打电话:
setDisable(true);
我现在正在打电话:
setEditable(false);
唯一剩下的问题是我想要将Node设置为已禁用,或者至少禁用文本选择。
是否有一种简单的方法可以在禁用Node时获得Node的确切样式,还是需要创建自己的CSS类? (不幸的是我的CSS知识相对较弱)。
答案 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");