2016-01-05 1 views
0

Как запроситьFocus на TextField различных вкладок TabPane, всякий раз, когда клавиша Enter нажата на этой конкретной вкладке.Как сосредоточиться на TextField в TabPane, когда нажата клавиша Enter (с использованием Javafx)?

Каждая вкладка в TabPane содержит TextField, когда конкретная вкладка выбирается с помощью Enter Key, чем TextField в этой закладке необходимо получить Focused (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

Изменить реализацию 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.1 и JavaFX: Focusing textfield programmatically

 Смежные вопросы

  • Нет связанных вопросов^_^