重点分页控制的内容节点

时间:2014-10-17 10:55:44

标签: java javafx-8

我有一个ListView作为JavaFX分页控件的内容节点。 我的目标是在选择新页面后将焦点设置为ListView。 我的方法的问题有时候ListView有焦点,但有时候没有。

在选择新页面后,如何确保ListView具有焦点?

平台: Windows 7的 JDK 1.8.0.25(64位)

代码:

package test.focus;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.Pagination;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Callback;

public class MainApp extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Pagination pagination = new Pagination(5);
        final ObservableList<String> texts = FXCollections.observableArrayList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j");
        final ListView<String> textsListView = new ListView<>();
        pagination.setPageFactory(new Callback<Integer, Node>() {

            @Override
            public Node call(Integer page) {
                textsListView.setItems(FXCollections.observableArrayList(texts.subList(page, page + 2)));
                textsListView.getSelectionModel().select(0);
                // Platform.runLater does not work, too
                textsListView.requestFocus();
                return textsListView;
            }
        });

        BorderPane root = new BorderPane(pagination);
        Scene scene = new Scene(root, 800, 600);

        stage.setTitle("Focus issue");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

1 个答案:

答案 0 :(得分:2)

您需要两件事才能始终关注列表:

  • pagination不应该成为焦点遍历循环的一部分。
  • 每次列表失去焦点时,都应该再次请求。

这对我有用:

    final ListView<String> textsListView = new ListView<>();
    textsListView.focusedProperty().addListener((ov,b,b1)->{
        if(!b1){
            textsListView.requestFocus();
        }
    });

    pagination.setFocusTraversable(false);
    pagination.setPageFactory(page -> {
        textsListView.setItems(
            FXCollections.observableArrayList(texts.subList(page, page + 2)));
        textsListView.getSelectionModel().select(0);

        textsListView.requestFocus();           
        return textsListView;
    });

修改

为了避免每次失去焦点的列表请求,这种方法只有在加载新页面时才会请求列表的焦点:

    final ListView<String> textsListView = new ListView<>();
    final BooleanProperty loaded=new SimpleBooleanProperty(false);         

    pagination.setFocusTraversable(false);
    pagination.setPageFactory(page -> {
        textsListView.setItems(
             FXCollections.observableArrayList(texts.subList(page, page + 2)));
        textsListView.getSelectionModel().select(0);

        loaded.set(true);
        return textsListView;
    });

    loaded.addListener((ov,b,b1)->{
        if(b1){
            textsListView.requestFocus();
            loaded.set(false);
        }
    });