【问题标题】:Function setOnKeyPressed is not working on DatePicker in Javafx?函数 setOnKeyPressed 在 Javafx 中的 DatePicker 上不起作用?
【发布时间】:2016-04-13 21:45:13
【问题描述】:

函数 setOnKeyPressed 不适用于 DatePicker。每当按下 Enter 或 Down 键时,我想将焦点从第一个 datepicker(startYear) 更改为第二个 datepicker(endyear),但它不起作用。 我尝试了以下代码。请帮帮我……!!

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);
    }

}

【问题讨论】:

    标签: javafx javafx-2 javafx-8


    【解决方案1】:

    使用EventFilter,即。 e.

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

    我。 e.

    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();
            }
    });
    

    【讨论】:

    • 有效,我试过了。我添加了过滤器代码。使用光标向上/向下进行测试,因为这是使用您的示例代码双向工作的唯一方法。
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多