2015-04-30 139 views
0

我有2个窗口应用程序通过SceneBuilder构建,第一个包含几个按钮和表列出一堆用户,第二个应打印出有关选定用户的详细信息。JavaFX TableView-TextField绑定

他们应该进行通信,以便点击第一个窗口中的行应该在第二个窗口中更改值,并且在第二个窗口中调整值应该修改第一个窗口中的可见字段(但现在我只是想让第一个窗口部分工作)。

我有tableView工作和检测选择事件时点击tableView行,并在第二个窗口中的字段初始化为初始用户值(我通过CustomerEmiter持有自己的客户字段跟踪这些)。但即使CustomerEmiter字段被修改,它们之后也不会改变。

窗口1个控制器snipet:

@Override 
public void initialize(URL location, ResourceBundle resources) { 
     id.setCellValueFactory(new PropertyValueFactory<>("id")); 
     userName.setCellValueFactory(new PropertyValueFactory<>("userName")); 
     // grab users from the DB 
     getUsers(); 
     customerTableView.setItems(customersObservableList); 

     customerTableView.getSelectionModel().selectedItemProperty() 
         .addListener((ObservableValue<? extends Customer> observable, Customer oldValue, Customer newValue) -> { 
      if (observable != null && observable.getValue() != null) { 
       CustomerEmiter.getCustomerEmiter() 
           .getCustomer().setUserName(newValue.userNameProperty()); 
      } 
     }); 
    } 

private ObservableList<Customer> customersObservableList = FXCollections.observableArrayList(); 

public void getUsers() { 
    List<CustomerObject> customerList = DataTransferObject.getCustomers(); 

    customerList.stream().forEach((customerO) -> { 
     customersObservableList.add(new Customer(customerO)); 
    }); 
} 

窗口2控制器snipet:

@FXML 
private TextField userNameTextField; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    Bindings.bindBidirectional(userNameTextField.textProperty(), 
           CustomerEmiter.getCustomerEmiter().getCustomer() 
              .userNameProperty()); 
} 

CustomerEmiter类:

public class CustomerEmiter { 
    private static CustomerEmiter instance = null; 
    private static Customer customer = new Customer(new CustomerObject()); 

    protected CustomerEmiter() { 
    } 

    public void setCustomer(Customer customer) { 
     CustomerEmiter.customer = customer; 
    } 

    public Customer getCustomer() { 
     return customer; 
    } 

    public static CustomerEmiter getCustomerEmiter() { 
     if(instance == null) { 
      instance = new CustomerEmiter(); 
     } 
     return instance; 
    } 
} 

客户类别:

public class Customer { 
    private IntegerProperty id; 
    private StringProperty userName; 

    public Customer(CustomerObject customer) { 
    this.id = new SimpleIntegerProperty(customer.id); 
    this.userName = new SimpleStringProperty(customer.userName); 

    public int getId() { 
     return this.id.get(); 
    } 

    public String getUserName() { 
     if(this.userName.isNull().get()) { 
      return "empty"; 
     } 
     return userName.get(); 
    } 

    public StringProperty userNameProperty() { 
     if(this.userName.isNull().get()) { 
      return new StringProperty("empty"); 
     } 
     return userName; 
    } 
+1

你能提供客户分类的片段吗?你的代码对我来说似乎很好。我希望看到getUsers()以及'customersObservableList'是如何初始化的 –

+0

向window1控制器和Customer类添加了相关信息,我在newUser/deleteUser按钮上重新填充了ObservableList,因此我将它们排除了。我已经删除了数据库连接直到我知道了,所以DataTransferObject.getCustomers()现在只创建5个虚拟客户。 – user3533671

+0

好的,你是否尝试过调试?你可以粘贴stackTrace吗? –

回答

1

我已经解决了这个问题,将两个.fxml文件合并为单个文件并摆脱绑定。我选择使用

textProperty().setValue 

代替表行选择事件。