gpt4 book ai didi

JavaFX - 初始化时未选择 ListView 项目

转载 作者:行者123 更新时间:2023-12-02 12:00:25 25 4
gpt4 key购买 nike

大家好,我有一个关于 JavaFX 中包含 ListView 的场景初始化的相当奇怪的问题。

问题是,当我为程序初始化场景时,我希望选择 ListView 的第一项。但是,如果我能够选择它(通过稍后提到的奇怪方法),ListView 本身就不会成为焦点。我想要发生的是选择 ListView 中的第一个项目并且 ListView 处于焦点状态。

我将从最少的代码开始尝试说明我的问题:

public class SceneSetter {

static Stage mainStage;
static Scene adminScene;
static AdminController adminCont;

public static void initialize(Stage stage) throws IOException {
mainStage = stage;

FXMLLoader adminLoader = new FXMLLoader();
adminLoader.setLocation(SceneSetter.class.getResource("/view/Admin.fxml"));
SplitPane adminRoot = adminLoader.load();
adminScene = new Scene(adminRoot);
adminCont = adminLoader.getController();

goToAdmin();
}

public static void goToAdmin() {
mainStage.setScene(adminScene);
//adminCont.initialize();
mainStage.show();
}
}

我原来的程序有多个场景,所有场景都需要在程序启动时设置。因此,在这个 SceneSetter 类中,所有这些场景都已设置并添加了 Controller 。我已删除这些场景,因为这段代码能够演示该问题。

我的管理 Controller 如下:

public class AdminController {
Stage mainStage;
private ObservableList<User> userList;

@FXML
private ListView<User> userListView;

@FXML
private Button adminAdd;

public void initialize() {
userListView.setItems(Admin.getUserlist());
userListView.getSelectionModel().select(0);
userListView.getFocusModel().focus(0);
}

public void setMainStage(Stage s) {
mainStage = s;
}
}

这里的问题是,当我运行代码时,我想要选择的项目是:

  1. 未选择
  2. 不在焦点

由于以下原因,我的困惑更加复杂。如果在我的 SceneSetter 类中,在我的 goToAdmin 方法中,注释的代码行 adminCont.initialize() 保持注释,则程序显示如下:

enter image description here

当我取消注释同一行代码时,程序显示如下:

enter image description here

在第一种情况下,甚至没有选择正确的项目。在第二个中,ListView 没有获得焦点。

如何解决这个问题?

最佳答案

为了集中某个控件,您需要请求它。您正在搜索的方法是requestFocus()。但是有一个问题!阅读 JavaDoc:

To be eligible to receive the focus, the node must be part of a scene, it and all of its ancestors must be visible, and it must not be disabled

所以这意味着你有两个选择。

  • 您可以在 Platform.runLater() 内调用 requestFocus() 以确保场景图已创建。

  • 在场景中添加控件后,您可以调用 requestFocus()

示例:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.stage.Stage;

public class SceneSetter extends Application {

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

@Override
public void start(Stage mainStage) throws Exception {
ListView<String> list = new ListView<String>();
ObservableList<String> items = FXCollections.observableArrayList("Single", "Double", "Suite", "Family App");
list.setItems(items);

list.getSelectionModel().select(0);

Platform.runLater(new Runnable() {
@Override
public void run() {
list.requestFocus();
}
});

mainStage.setScene(new Scene(list));
// or here
// list.requestFocus();
mainStage.show();
}

}

FXML 文件示例

主要:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.stage.Stage;

public class SceneSetter extends Application {

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

@Override
public void start(Stage mainStage) throws Exception {
ListView<String> list = FXMLLoader.load(this.getClass().getResource("GUI.fxml"));

mainStage.setScene(new Scene(list));

mainStage.show();
}

}

Controller :

import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.ListView;

public class MyController {

@FXML
private ListView<String> userListView;

@FXML
public void initialize() {

ObservableList<String> items = FXCollections.observableArrayList("Single", "Double", "Suite", "Family App");
userListView.setItems(items);
userListView.getSelectionModel().select(0);

Platform.runLater(new Runnable() {
@Override
public void run() {
userListView.requestFocus();
}
});
}
}

关于JavaFX - 初始化时未选择 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47297100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com