JavaFX-初始化时未选择ListView项
大家好,关于JavaFX中包含ListView的场景的初始化,我有一个相当奇怪的问题 问题是,当我为我的程序初始化场景时,我希望选择ListView的第一项。但是,如果我能够选择它(通过后面提到的奇怪方式),ListView本身就不在焦点中。我想做的是,ListView中的第一项被选中,并且ListView处于焦点位置 我将从最少的代码开始,尝试说明我的问题:JavaFX-初始化时未选择ListView项,java,listview,javafx,javafx-8,Java,Listview,Javafx,Javafx 8,大家好,关于JavaFX中包含ListView的场景的初始化,我有一个相当奇怪的问题 问题是,当我为我的程序初始化场景时,我希望选择ListView的第一项。但是,如果我能够选择它(通过后面提到的奇怪方式),ListView本身就不在焦点中。我想做的是,ListView中的第一项被选中,并且ListView处于焦点位置 我将从最少的代码开始,尝试说明我的问题: public class SceneSetter { static Stage mainStage; static Scene adm
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类中,所有这些场景都已设置,并且添加了控制器。我已经删除了这些代码,因为这段代码能够演示这个问题
我的管理员控制器如下:
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;
}
}
公共类管理员控制器{
舞台主体;
私有可观察用户列表;
@FXML
私有ListView用户ListView;
@FXML
专用按钮adminAdd;
公共无效初始化(){
setItems(Admin.getUserlist());
userListView.getSelectionModel().select(0);
userListView.getFocusModel().focus(0);
}
公共设施(第s阶段){
主干=s;
}
}
这里的问题是,当我运行代码时,我想要选择的项目是:
adminCont.initialize()
保持注释状态,则程序显示如下:
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;
}
}
当我取消注释同一行代码时,程序显示如下:
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;
}
}
在第一种情况下,甚至没有选择正确的项目。在第二种情况下,ListView不在焦点中
如何解决此问题?要聚焦控件,您需要请求它。您正在搜索的方法是
requestFocus()
。但有一个陷阱。阅读JavaDoc:
要有资格接收焦点,节点必须是场景的一部分,
它和它的所有祖先都必须是可见的,而不是可见的
残废
这意味着你有两个选择
- 您可以在
中调用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();
}
}
导入javafx.application.application;
导入javafx.application.Platform;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.scene;
导入javafx.scene.control.ListView;
导入javafx.stage.stage;
公共类SceneSetter扩展了应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(阶段主体)引发异常{
ListView列表=新建ListView();
ObservableList items=FXCollections.observableArrayList(“单人”、“双人”、“套房”、“家庭应用”);
列表。设置项目(项目);
list.getSelectionModel().select(0);
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
requestFocus();
}
});
主场景.场景(新场景(列表));
//还是在这里
//requestFocus();
show();
}
}
FXML文件示例
Main:
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();
}
}
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.application.application;
导入javafx.fxml.fxmloader;
导入javafx.scene.scene;
导入javafx.scene.control.ListView;
导入javafx.stage.stage;
公共类SceneSetter扩展了应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(阶段主体)引发异常{
ListView list=FXMLLoader.load(this.getClass().getResource(“GUI.fxml”);
主场景.场景(新场景(列表));
show();
}
}
控制器:
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();
}
}
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.application.Platform;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.fxml.fxml;
导入javafx.scene.control.ListView;
公共类MyController{
@FXML
私有ListView用户ListView;
@FXML
公共无效初始化(){
ObservableList items=FXCollections.observableArrayList(“单人”、“双人”、“套房”、“家庭应用”);
userListView.setItems(项目);
userListView.getSelectionModel().select(0);
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
userListView.requestFocus();
}
});
}
}
要聚焦控件,您需要请求它。您正在搜索的方法是requestFocus()
。但有一个陷阱。阅读JavaDoc:
要有资格接收焦点,节点必须是场景的一部分,
它和它的所有祖先都必须是可见的,而不是可见的
残废
这意味着你有两个选择
- 您可以在
中调用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();
}
}
导入javafx.application.application;
导入javafx.application.Platform;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.scene;
导入javafx.scene.control.ListView;
导入javafx.stage.stage;
公共类SceneSetter扩展了应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(阶段主体)引发异常{
ListView列表=新建ListView();