从 TextField JavaFX 中删除默认焦点
remove default focus from TextField JavaFX
我用SceneBuilder设计了一些TextField,当我运行代码时,其中一个TextField默认被点击,我想当我运行代码时,[= TextFields 的 17=] 默认得到 selected,用户 select 一个 TextFiled。
更新:正如您在 this 图像中看到的,当代码 运行s(字段中没有光标)
时,我想使第一个字段与其他两个字段一样
我该怎么做?
由于没有public方法来实现,所以没有直接的方法。不过,您可以使用技巧来做到这一点。您可以使用 BooleanProperty
来检查控件何时首次获得焦点。监听控件的 focusProperty()
,当它第一次获得焦点时,将焦点委托给它的容器。对于其余的焦点,它将正常工作。
示例:
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
final BooleanProperty firstTime = new SimpleBooleanProperty(true); // Variable to store the focus on stage load
VBox vBox = new VBox(10);
vBox.setPadding(new Insets(20));
TextField t1 = new TextField();
TextField t2 = new TextField();
TextField t3 = new TextField();
t1.setPromptText("FirstName");
t2.setPromptText("LastName");
t3.setPromptText("Email");
vBox.getChildren().addAll(new HBox(t1, t2), t3);
primaryStage.setScene(new Scene(vBox, 300, 300));
primaryStage.show();
t1.focusedProperty().addListener((observable, oldValue, newValue) -> {
if(newValue && firstTime.get()){
vBox.requestFocus(); // Delegate the focus to container
firstTime.setValue(false); // Variable value changed for future references
}
});
}
public static void main(String[] args) {
launch(args);
}
}
初始屏幕加载时:
就我而言,接受的答案无效。但这有效:
我请求关注 runLater 中包含的父对象。
@FXML
public void initialize() {
//unfocus pathField
Platform.runLater( () -> root.requestFocus() );
}
直接调用 requestFocuss 不起作用。
不可编辑的 TextField 也有同样的问题,每次都会 select 编辑并突出显示。
通过设置 myTextField.setFocusTraversable(false);
解决
请注意,在这种情况下,焦点转到下一个 UI 元素,您必须设置您不想聚焦的每个元素。您也失去了通过 Tab 键 select 元素的能力。
ApiDoc 声明 setFocusTraversable() 默认为 false,但这似乎不起作用,除非明确调用。
你可以简单的在initialize方法中设置focus traversable为false。这是一个例子:
@Override
public void initialize(URL location, ResourceBundle resources) {
yourTextField.setFocusTraversable(false);
}
您可以简单地使用 Bindings
TextField textField = new TextField();
textField.styleProperty().bind(
Bindings
.when(textField.focusedProperty())
.then("-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);")
.otherwise("-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);"));
这将使您的提示文本保持可见,即使当 TextField 被聚焦时,只要它是空的。
我用SceneBuilder设计了一些TextField,当我运行代码时,其中一个TextField默认被点击,我想当我运行代码时,[= TextFields 的 17=] 默认得到 selected,用户 select 一个 TextFiled。
更新:正如您在 this 图像中看到的,当代码 运行s(字段中没有光标)
时,我想使第一个字段与其他两个字段一样我该怎么做?
由于没有public方法来实现,所以没有直接的方法。不过,您可以使用技巧来做到这一点。您可以使用 BooleanProperty
来检查控件何时首次获得焦点。监听控件的 focusProperty()
,当它第一次获得焦点时,将焦点委托给它的容器。对于其余的焦点,它将正常工作。
示例:
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
final BooleanProperty firstTime = new SimpleBooleanProperty(true); // Variable to store the focus on stage load
VBox vBox = new VBox(10);
vBox.setPadding(new Insets(20));
TextField t1 = new TextField();
TextField t2 = new TextField();
TextField t3 = new TextField();
t1.setPromptText("FirstName");
t2.setPromptText("LastName");
t3.setPromptText("Email");
vBox.getChildren().addAll(new HBox(t1, t2), t3);
primaryStage.setScene(new Scene(vBox, 300, 300));
primaryStage.show();
t1.focusedProperty().addListener((observable, oldValue, newValue) -> {
if(newValue && firstTime.get()){
vBox.requestFocus(); // Delegate the focus to container
firstTime.setValue(false); // Variable value changed for future references
}
});
}
public static void main(String[] args) {
launch(args);
}
}
初始屏幕加载时:
就我而言,接受的答案无效。但这有效:
我请求关注 runLater 中包含的父对象。
@FXML
public void initialize() {
//unfocus pathField
Platform.runLater( () -> root.requestFocus() );
}
直接调用 requestFocuss 不起作用。
不可编辑的 TextField 也有同样的问题,每次都会 select 编辑并突出显示。
通过设置 myTextField.setFocusTraversable(false);
解决请注意,在这种情况下,焦点转到下一个 UI 元素,您必须设置您不想聚焦的每个元素。您也失去了通过 Tab 键 select 元素的能力。
ApiDoc 声明 setFocusTraversable() 默认为 false,但这似乎不起作用,除非明确调用。
你可以简单的在initialize方法中设置focus traversable为false。这是一个例子:
@Override
public void initialize(URL location, ResourceBundle resources) {
yourTextField.setFocusTraversable(false);
}
您可以简单地使用 Bindings
TextField textField = new TextField();
textField.styleProperty().bind(
Bindings
.when(textField.focusedProperty())
.then("-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);")
.otherwise("-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);"));
这将使您的提示文本保持可见,即使当 TextField 被聚焦时,只要它是空的。