当按下Enter键时(如何使用Javafx),如何在TabPane中关注TextField?

时间:2016-01-05 10:14:10

标签: javafx javafx-2 javafx-8

如果在特定标签上按下Enter键,如何在TabPane的不同标签的TextField上请求焦点。

TabPane中的每个选项卡都包含TextField,只要使用Enter键选择特定选项卡,该选项卡中的TextField必须获得聚焦(requestFocus)

package tabdemo;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class TabDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        TabPane tabPane = new TabPane();
        tabPane.setPrefHeight(500);
        VBox.setVgrow(tabPane, Priority.ALWAYS);
        tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
        tabPane.setStyle("-fx-background-color: #fff; -fx-border-color: #e7eaec #e7eaec #e7eaec #e7eaec; -fx-border-width: 6;");

        Tab tab1 = new Tab();
        tab1.setText(" Try Demo");
        tab1.setId("TryDemo");
        TextField username1 = new TextField();
        tab1.setContent(username1);

        Tab tab2 = new Tab();
        tab2.setText(" Select Company");
        tab2.setId("SelectCompany");
        TextField username2 = new TextField();
        tab2.setContent(username2);

        Tab tab3 = new Tab();
        tab3.setText(" Create Company");
        tab3.setId("CreateCompany");
        TextField username3 = new TextField();
        tab3.setContent(username3);

        //Add childen to tabpane
        tabPane.getTabs().addAll(tab1, tab2, tab3);

        StackPane root = new StackPane();
        root.getChildren().add(tabPane);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();

        // Tabpane Change Listener
        tabPane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {

            @Override
            public void changed(ObservableValue<? extends Tab> arg0, Tab oldtab, Tab newtab) {
                if (newtab == tab1) {

                }
                if (newtab == tab2) {

                }
                if (newtab == tab3) {
                    //tab3.getContent().requestFocus();
                    //username3.requestFocus();
                }
            }
        });
        // End Tabpane Change Listener

        // Root Listner
        root.setOnKeyPressed(new EventHandler<KeyEvent>() {

            public void handle(KeyEvent event) {
                if (event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.ENTER) {
                    tabPane.requestFocus();
                    event.consume();
                }
            }
        });
        // END Root Listner

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

ChangeListener的实施更改为:

// Tabpane Change Listener
tabPane.getSelectionModel().selectedItemProperty().addListener((arg0, oldtab, newtab) -> {
    TextField field = (TextField) newtab.getContent();
    Platform.runLater(() -> field.requestFocus());
});

这可确保将焦点请求作为最后一项任务推送。对于应用程序线程。

另请参阅RequestFocus in TextField doesn't work -JavaFX 2.1JavaFX: Focusing textfield programmatically