01/10/2018, 14:20

Trigger ObservableList's change event from contained elements

Chào các bạn,

Mình có class Person mà object của nó là element của ObservableList<Person> list. list là data của tableView. Câu hỏi của mình là: Làm sao để update tableView khi thay đổi giá trị của field của Person.

Class Person:

public class Person {

private final SimpleStringProperty name = new SimpleStringProperty("");
private final DoubleProperty height = new SimpleDoubleProperty();

public Person() {
	
}
public Person(String name, double height) {
    this.setName(name);
    this.setHeight(height);
   
}

public void setName(String name) {
    this.name.set(name);
}

public void setHeight(double height) {
    this.height.set(height);
}	
public DoubleProperty getHeightProperty() {
	return height;
}

}

client sử dụng Person:

public class SuperModelController {
	    private TableView<Person> tableView;
	   
	    
	    private ObservableList<Person> list = FXCollections.observableArrayList();

	    @FXML
		public void initialize() {
	    	Person ngocTrinh = new Person("Ngoc Trinh", 1.5);
			Person baTung = new Person("Ba Tung", 1.6);
			Person minhHang = new Person("Minh Hang", 1.5);
			
			ngocTrinh.getHeightProperty().addListener(c->{
				// Trigger data list change event to update tableView
			// Thuc ra tableView nam o 1 client khac su dung list
			});
	    	
			list.addAll( 
				ngocTrinh, baTung, minhHang
		    );
			tableView.setItems(list);
			
		}
	    

	    public void addPerson(String name, double height) {
	        
	    	list.add(new Person(name,  height));
	       
	    }
	    
	   
	    public void modifyPerson(int index,  String name, double height) {
	    	list.get(index).setName(name);
	    	list.get(index).setHeight(height);
	    }

}

Mình viết caption TA vì mình từ học code bằng sách TA nên cũng chưa quen viết các thuật ngữ này bằng TV. Mong các bạn thông cảm.

viết 16:21 ngày 01/10/2018

tableView.refresh(); ?

anon45952904 viết 16:31 ngày 01/10/2018

tableView.refresh(); ?

Như này tức là SuperModelController hoặc Person phải có reference tới tableView.
Liệu có làm đc cách giống như sau trong javafx không bác:

ngocTrinh.getHeightProperty().addListener(c->{
	 list.trigger("list change event"); Khi này tableView sẽ đc update
     hoặc 
     emitEvent("personChanged"); Table listen to "personChanged" event and refresh
  });

Cảm ơn bác.

viết 16:36 ngày 01/10/2018
stackoverflow.com
mynameisJEFF

Javafx: Detect ALL changes made to tableView including addition/deletion of table rows and cell edits on any table rows

java, javafx
asked by mynameisJEFF on 12:30PM - 17 Aug 15

cái này chắc giống nè, ngâm cứu đi

anon45952904 viết 16:31 ngày 01/10/2018

Extractor khi khởi tạo list:

 ObservableList<Person> list= FXCollections.observableArrayList(
    			person->
                new Observable[] {
                        person.getNameProperty(),
                        person.getHeightProperty(),
                        
});

Listen to add, update, delete, replace events

list.addListener(c->{
    	while(c.next()) {
    		if(c.wasAdded())
    			System.out.println("Trigger added event");
    		
    		if(c.wasRemoved())
    			System.out.println("Trigger removed event");
    		
    		if(c.wasUpdated())
    			System.out.println("Trigger updated event");
    		
    		if(c.wasReplaced())
    			System.out.println("Trigger replaced event");
    	}
    });

Set tableView Sync with list:

private TableView<Person> table = new TableView<Person>();
 
        
        TableColumn<Person, Double> height = new TableColumn<Person, Double>("Height");           
        height.setCellValueFactory(cell->cell.getValue().getHeightProperty().asObject());
    
        TableColumn<Person, Double> name = new TableColumn<Person, String>("Name");
        name .setCellValueFactory(cell->cell.getValue().getNameProperty());
 
        table.getColumns().addAll(name, height); 

Chuẩn luôn. Cảm ơn bá

Bài liên quan
0