JavaFX:在按键事件上获取 TableView 中的目标行索引

标签 java javafx

我有以下代码:

public class JavaFxApplication extends Application{

    public class Article{

        private ObjectProperty<Integer> id;

        private StringProperty title;

        public Article(ObjectProperty<Integer> id, StringProperty title) {
            this.id = id;
            this.title = title;
        }

        public ObjectProperty<Integer> getId() {
            return id;
        }

        public StringProperty getTitle() {
            return title;
        }
    }    

    @Override
    public void start(Stage stage) throws Exception {
        ObservableList<Article> articles=FXCollections.observableArrayList();
        for (int i=0;i<200;i++){
            articles.add(new Article(new SimpleObjectProperty<Integer>(i), new SimpleStringProperty("title_"+i)));
        }
        TableView<Article> tableView=new TableView(articles);
        TableColumn<Article,Integer> idColumn=new TableColumn("ID");
        idColumn.setCellFactory(TextFieldTableCell.forTableColumn‌​(new IntegerStringConverter()));
        idColumn.setCellValueFactory(data->data.getValue().getId());
        tableView.getColumns().add(idColumn);

        TableColumn<Article,String> titleColumn=new TableColumn("Title");
        titleColumn.setCellValueFactory(data->data.getValue().getTitle());
        tableView.getColumns().add(titleColumn);

        tableView.setOnKeyPressed((KeyEvent t)-> {
            KeyCode key=t.getCode();
            if (key==KeyCode.PAGE_DOWN){
                int pos=tableView.getSelectionModel().getSelectedIndex();
                System.out.println("INDEX:"+pos);
            }
        });

        VBox vbox=new VBox();
        vbox.getChildren().add(tableView);
        Scene scene=new Scene(vbox, 200, 400);
        stage.setScene(scene);
        stage.show();
    }

}

运行此应用程序后,我选择第一行(id=0)并按向下翻页键。我想获取焦点到达的行的索引,而不是焦点离开的行的索引。但在我的示例中,应用程序输出是 INDEX:0。如何获取目标行索引?

最佳答案

您的事件处理程序在处理“向下翻页”操作的内置事件处理程序之前被调用。

改用 KEY_RELEASED 处理程序:

tableView.setOnKeyReleased((KeyEvent t)-> {
    KeyCode key=t.getCode();
    if (key==KeyCode.PAGE_DOWN){
        int pos=tableView.getSelectionModel().getSelectedIndex();
        System.out.println("INDEX:"+pos);
    }
});

关于JavaFX:在按键事件上获取 TableView 中的目标行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41512146/

相关文章:

java - 程序未针对 Java 进行编译,我缺少什么

java - 递归问题中的原子整数或 int[] (LeetCode124)

JavaFX:在 Pane 内同时移动数百个 ImageView(性能问题)

java - 将值从 javascript 传递到 JavaFX

java - 如何将抗锯齿应用于 GraphicsContext.fillArc() 等 javafx 方法?

java - 并行的 flatMap 总是顺序的

java - 应用程序引擎 URL 类日志记录警告

抓取文本时 JavaFX Textfield 位于一个字符后面

java - 如何更改警报对话框的图标?

java - 为什么 EJB 在与 JavaFX 一起使用时会出现 nullpointerException?