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