2014-10-05 55 views
0

我正在开发简单的JavaFX应用程序。在我的主视图中我有桌面视图。在行选择方法selectedEmployeeDetails()被调用。它填写显示员工详细信息的标签(姓名,姓氏等)。当我启动我的应用程序并选择第一行(仅第一行)时,什么都没有发生。当我选择secound行时,一切都很好。然后,当我再次选择第一行时,所有工作都正常。这里是我的代码在主视图控制器的初始化方法中。JavaFX和表视图 - 首次选择不起作用

@FXML 
private void initialize() { 

     dialog.setMaximized(); 
     dialog.setTitle("Test"); 

     this.employeeModel.loadData(); 
     employees = this.employeeModel.getEmployees(); 
     employeeTableView.setItems(employees); 

     this.employeeFirstName.setCellValueFactory(
        new PropertyValueFactory<Employee, String>("name")); 
     this.employeeFirstName.setCellFactory(TextFieldTableCell.forTableColumn()); 

     this.employeeLastName.setCellValueFactory(
        new PropertyValueFactory<Employee, String>("lastname")); 
     this.employeeLastName.setCellFactory(TextFieldTableCell.forTableColumn()); 

     this.employeeFatherClmn.setCellValueFactory(
        new PropertyValueFactory<Employee, String>("fathersName")); 
     this.employeeFatherClmn.setCellFactory(TextFieldTableCell.forTableColumn()); 

     this.employeeJmbgClmn.setCellValueFactory(
        new PropertyValueFactory<Employee, String>("jmbg")); 
     this.employeeJmbgClmn.setCellFactory(TextFieldTableCell.forTableColumn()); 

     this.employeeContractClmn.setCellValueFactory(
        new PropertyValueFactory<Employee, String>("contractType")); 
     this.employeeContractClmn.setCellFactory(TextFieldTableCell.forTableColumn()); 

     this.employeePositionClmn.setCellValueFactory(
        new PropertyValueFactory<Employee, String>("position")); 
     this.employeePositionClmn.setCellFactory(TextFieldTableCell.forTableColumn()); 

     this.employeeStatusClmn.setCellValueFactory(
        new PropertyValueFactory<Employee, String>("status")); 
     this.employeeStatusClmn.setCellFactory(TextFieldTableCell.forTableColumn()); 

     //employeeTableView.getColumns().addAll(employeeFirstName, employeeLastName); 


     selectedEmployeeDetails(null); 

     //Add change listener 
     employeeTableView.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> { 
      //Check whether item is selected and set value of selected item to Label 
       if (employeeTableView.getSelectionModel().getSelectedItem() != null) { 

        selectedEmployeeDetails(newValue); 
        System.out.println(employeeTableView.getSelectionModel().getSelectedIndex()); 
       } 
       else 
       { 
       System.out.println("EROR"); 
       } 

    }); 

} 

有人可以帮我看看什么是主要的原因我的第一行不会火selectedEmployeeDetails()方法的第一次选择。

编辑

private void selectedEmployeeDetails(Employee employee) 
    { 

     if(employee != null) 
     { 
      this.employeeDetailLastname.setText(employee.getLastname()); 
      this.emloyeeDetailFathersName.setText(employee.getFathersName()); 
      this.employeeDetailName.setText(employee.getName()); 
      this.emloyeeDetailJmbg.setText(employee.getJmbg()); 
      this.emloyeeDetailPosition.setText(employee.getPosition()); 
      this.employeeDetailContractType.setText(employee.getContractType()); 
      this.employeeDetailStatus.setText(employee.getStatus()); 

     } 

     else 
     { 
      this.employeeDetailLastname.setText(""); 
      this.emloyeeDetailFathersName.setText(""); 
      this.employeeDetailName.setText(""); 
      this.emloyeeDetailJmbg.setText(""); 
      this.emloyeeDetailPosition.setText(""); 
      this.employeeDetailContractType.setText(""); 
      this.employeeDetailStatus.setText(""); 

     } 
    } 

回答

1

当您添加的项目表中,第一个项目将立即选择。在向监听器注册选择模型的所选项目属性之前,会发生这种情况,所以不会为该初始选择调用监听器的方法。

移动线

this.employeeModel.loadData(); 
    employees = this.employeeModel.getEmployees(); 
    employeeTableView.setItems(employees); 

initialize()方法的末尾,则与所选择的项目注册监听器之后。

+0

谢谢James_D。你是stackoverflow传说:) – Sysrq147 2014-10-05 14:26:29