2016-01-09 1 views
0

Функция SetOnKeyPressed не работает с DatePicker. Я хочу изменить фокус с первого datepicker (startYear) на второй datepicker (endyear), когда нажата клавиша Enter или Down, но она не работает. I'hv попробовал следующий код. Пожалуйста, помогите мне ... !!Функция setOnKeyPressed не работает с DatePicker в Javafx?

package datedemo; 

import com.sun.javafx.robot.FXRobot; 
import com.sun.javafx.robot.FXRobotFactory; 
import java.time.LocalDate; 
import java.time.format.DateTimeFormatter; 
import java.util.Calendar; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.DatePicker; 
import javafx.scene.control.Label; 
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; 

/** 
* 
* @author vikassingh 
*/ 
public class DateDemo extends Application { 

    DatePicker startYear = new DatePicker(); 
    DatePicker endYear = new DatePicker(); 

    @Override 
    public void start(Stage primaryStage) { 
     /* Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
     System.out.println("Hello World!"); 
     } 
     }); */ 

     // Year Start and END 
     int start_year = 0; 
     int end_year = 0; 
     Calendar cal = Calendar.getInstance(); 
     int year = cal.get(cal.YEAR); 
     int month = cal.get(cal.MONTH) + 1; //zero-based 
     System.out.println("year = " + year + "\nmonth = " + month); 
     if (month < 4) { 
      start_year = year - 1; 
      end_year = year; 
     } else { 
      start_year = year; 
      end_year = year + 1; 
     } 

     String start_year_date = "01/04/" + start_year; 
     String end_year_date = "31/03/" + end_year; 

     //Get Start & End Date; 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 
     LocalDate startDate = LocalDate.parse(start_year_date, formatter); 
     LocalDate endDate = LocalDate.parse(end_year_date, formatter); 

     VBox box = new VBox(); 
     VBox.setVgrow(box, Priority.ALWAYS); 

     Label startYearLabel = new Label("Start Year * :"); 
     box.getChildren().add(startYearLabel); 

     startYear.setValue(startDate); 
     startYear.setPromptText("DD/MM/YYYY"); 
     box.getChildren().add(startYear); 
     Label endYearLabel = new Label("End Year * :"); 
     box.getChildren().add(endYearLabel); 
     endYear.setValue(endDate); 
     endYear.setPromptText("DD/MM/YYYY"); 
     box.getChildren().add(endYear); 

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

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

     primaryStage.setTitle("Date Demo"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     // Listner 
     startYear.setOnKeyPressed(new EventHandler<KeyEvent>() { 
      public void handle(KeyEvent event) { 
       if (event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.DOWN) { 
        endYear.requestFocus(); 
        event.consume(); 
       } 
       if (event.getCode() == KeyCode.UP) { 
        // do something 
        event.consume(); 
       } 
      } 
     }); 

     endYear.setOnKeyPressed(new EventHandler<KeyEvent>() { 
      public void handle(KeyEvent event) { 
       if (event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.DOWN) { 
        // do something 
        event.consume(); 
       } 
       if (event.getCode() == KeyCode.UP) { 
        startYear.requestFocus(); 
        event.consume(); 
       } 
      } 
     }); 
    } 

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

} 

ответ

2

Использовать EventFilter, i. е.

startYear.addEventFilter(KeyEvent.KEY_PRESSED, event -> { 
... 
}); 

endYear.addEventFilter(KeyEvent.KEY_PRESSED, event -> { 
... 
}); 

i. е.

startYear.addEventFilter(KeyEvent.KEY_PRESSED, event -> { 

     if (event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.DOWN) { 
      endYear.requestFocus(); 
      event.consume(); 
     } 
     if (event.getCode() == KeyCode.UP) { 
      // do something 
      event.consume(); 
     } 
}); 

endYear.addEventFilter(KeyEvent.KEY_PRESSED, event -> { 
     if (event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.DOWN) { 
      // do something 
      event.consume(); 
     } 
     if (event.getCode() == KeyCode.UP) { 
      startYear.requestFocus(); 
      event.consume(); 
     } 
}); 
+0

Не работает. –

+0

Он работает, я попробовал. Я добавил код фильтра. Используйте курсор вверх/вниз для тестирования, так как это единственное, что работает в обоих направлениях с использованием кода примера. – Roland

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

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