2014-10-05 28 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