Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX-初始化时未选择ListView项_Java_Listview_Javafx_Javafx 8 - Fatal编程技术网

JavaFX-初始化时未选择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

大家好,关于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类中,所有这些场景都已设置,并且添加了控制器。我已经删除了这些代码,因为这段代码能够演示这个问题

我的管理员控制器如下:

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;
}
}
这里的问题是,当我运行代码时,我想要选择的项目是:

  • 未选择
  • 不对焦
  • 我的困惑是以下几点造成的。如果在我的SceneSetter类中,在我的goToAdmin方法中,注释的代码行
    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();