从TextField JavaFX中删除默认焦点

时间:2015-03-14 16:20:15

标签: javafx textfield scenebuilder

我已经在SceneBuilder的表单中设计了一些TextField,当我运行代码时,默认情况下已经单击了一个TextFields,我想在运行代码时,默认情况下没有选择任何TextFields并且用户选择了TextFiled。

更新:正如您在this图片中看到的那样,我希望在代码运行时将第一个字段设置为其他两个字段(字段中没有光标)

我该怎么做?

5 个答案:

答案 0 :(得分:13)

就我而言,接受的答案是行不通的。但这很有效:

我请求在runLater中包含父项的焦点。

  $('#approve').change(function(){
       var data1 = $(this).val();
        $.ajax({ / / ajax block starts
        url: 'update.php', // 
       type: 'POST',
       data: {
         data1: data1 
       },

     success: function(data) {

        }
     });

直接调用requestFocuss不起作用。

答案 1 :(得分:4)

与不可编辑的TextField存在同样的问题,每次都会选中并突出显示。

通过设置myTextField.setFocusTraversable(false);

来解决它

请注意,在这种情况下,焦点转到下一个UI元素,您必须设置您不想要关注的每个元素。您也失去了通过Tab键选择元素的能力。

ApiDoc表示默认情况下setFocusTraversable()为false,但这似乎不起作用,除非明确调用。

答案 2 :(得分:3)

由于没有公共方法来实现这一目标,因此没有直接的方法。虽然,你可以使用一个技巧来做到这一点。您可以使用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);
    }
}

在初始屏幕加载时:

enter image description here

答案 3 :(得分:0)

您可以简单地使用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处于焦点状态,只要它为空即可。

答案 4 :(得分:-1)

您只需在initialize方法中将可遍历的焦点设置为false即可。这是一个示例:

@Override
public void initialize(URL location, ResourceBundle resources) {
    yourTextField.setFocusTraversable(false);
}