JavaFX TextField 在焦点上将填充更改为 0

Posted

技术标签:

【中文标题】JavaFX TextField 在焦点上将填充更改为 0【英文标题】:JavaFX TextField changing padding to 0 on focus 【发布时间】:2019-11-21 05:17:29 【问题描述】:

我正在尝试为 JavaFX 中的文本字段设置填充(使用 Java 8_192)。 我有一个简单的 VBox,里面有 3 个 TextField。如果我在第一个 TextField 上手动设置填充,当我关注它们时,其他 TextField 会以某种方式将它们的填充重置为 0。

第一个 TextField 有一个手动填充:

当聚焦第二个(或第三个)TextField 时,它们的填充为 0:

如果我关注不同的东西,它们的填充将重置为 javafx 设置的常用填充(4、7、4、7)。奇怪的是,如果我设置tf2 的填充而不是tf1,就不会有任何问题。 另外,如果我手动设置每个 TextField 的填充,它们不会被重置为 0。但这显然不能成为答案......

我的代码:

public class Main extends Application 
    @Override
    public void start(Stage primaryStage) 
        VBox vbox = new VBox();
        vbox.setSpacing(10);
        vbox.setPadding(new Insets(10, 10, 10, 10));

        TextField tf1 = new TextField();
        TextField tf2 = new TextField();
        TextField tf3 = new TextField();

        vbox.getChildren().addAll(tf1);
        vbox.getChildren().addAll(tf2);
        vbox.getChildren().addAll(tf3);

        tf1.setPadding(new Insets(7, 7, 7, 7));
        // Setting the padding of tf2 instead of tf1 works

        Scene scene = new Scene(vbox, 250, 150);
        primaryStage.setScene(scene);
        primaryStage.show();
    

    public static void main(String[] args) 
        launch(args);
    

为什么只有在将填充设置为我添加到 vbox 的第一个 TextField 时,焦点后才会重置填充?

【问题讨论】:

我也在 Java 8 上重现了这个问题。使用.addAll(..)时的旁注,您应该添加所有这些,而不仅仅是一个或只使用.add(...) 我可以在 JavaFX 12.0.1 中重现该问题。通过setStyle("-fx-padding: 7px;") 设置填充似乎是一种解决方法。 如果不想already exist,你可能想submit a bug report。 这绝对是一个错误。整个问题与 CSS 和 pseudoClasses 状态变化有关。重置为填充 0 发生在 CsssStyleHelper。这个comment 真正解释了发生了什么。如果第一个节点没有聚焦,您的失败案例将不会发生。 嗯,这是一种可能的解决方法:只需将 tf1.getStyleClass().add("tf1"); 添加到您的代码中。即使您没有应用 CSS 样式表,或者您没有向其中添加任何内容,它看起来也可以解决问题。同样,它与 CssStyleHelper 中应用的复杂逻辑有关。 【参考方案1】:

如果我理解正确,您只想设置文本字段的填充,当它像标题一样聚焦时,那么我会使用这个:

yourTextField.focusedProperty().addListener(new ChangeListener<Boolean>() 
    @Override
    public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) 
        if (newPropertyValue) 
            System.out.println("Textfield on focus");
    
            yourTextField.setStyle("-fx-padding: *yourNewPadding*");
         else 
            System.out.println("Textfield out focus");

            yourTextField.setStyle("-fx-padding: *yourOldPadding*");
        
    
);

希望对您有所帮助! 抱歉,如果这不能回答您的问题,但这是我的理解。

【讨论】:

【参考方案2】:

Java 是一种面向对象的编程语言。大多数代码都在为那个对象设置东西。最简单(在大多数情况下也是最实用)的解决方案是手动设置对象的填充。

另一方面,VBox.addAll(Node...) 允许您传递许多对象,而不仅仅是一个。如果只需要传一个,使用 VBox.add(Node);

【讨论】:

以上是关于JavaFX TextField 在焦点上将填充更改为 0的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX中的可复制Label / TextField / LabeledText

使用箭头键控制连接到 TextField 的 JavaFX ContextMenu

如何在 onfocus 和 outfocus 时在 JavaFX TextField 上执行任务?

Javafx 。如何获得下一个元素非焦点丢失

在焦点 jquery 上将占位符输入类型文本更改为密码

如何在不更改 javafx 边框的情况下更改 TextField 的背景颜色?