我有一个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);
}
}
发布于 2014-10-17 04:27:28
你需要做两件事才能把注意力始终放在清单上:
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);
}
});
https://stackoverflow.com/questions/26423496
复制