我在學習JavafX,因此如何用屬性來思考。ChangeListener在Javafx中不觸發
我有一顆豆,我用它來更新的TableView,像這樣:
public class DDTTabController extends DefaultTabController implements Initializable {
....
@FXML
private TableView<DDTTableView> ddtTable;
....
@FXML
private TableColumn<DDTTableView, String> rifColumn;
....
}
等。我初始化我的控制器是這樣的:
@Override
public void initialize(URL url, ResourceBundle rb) {
....
rifColumn.setCellValueFactory(cellData -> cellData.getValue().getRifProperty());
....
}
這是我使用的瀏覽豆:
private class DDTTableView {
private ObjectProperty<DDT> ddt;
private ObjectProperty<Contact> contact;
private StringProperty rif;
public DDTTableView() {
this.ddt = new SimpleObjectProperty<>();
this.contact = new SimpleObjectProperty<>();
this.rif = new SimpleStringProperty("");
}
public DDTTableView(DDT o) {
this();
this.setDdt(o);
this.setContact(dataManager.getContactForCodeType(o.getAnaTipe(), o.getAnaCode().trim()));
this.ddt.get().getRowsProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
System.out.println("bip!");
rif.set(...... buildString ......);
}
});
}
public StringProperty getRifProperty() {
return this.rif;
}
public String getRif() {
return this.rif.get();
}
public void setRif(String r) {
this.rif.set(r);
}
public ObjectProperty<DDT> getDdtProperty() {
return ddt;
}
public DDT getDdt() {
return ddt.get();
}
public void setDdt(DDT ddt) {
this.ddt.set(ddt);
}
public ObjectProperty<Contact> getContactProperty() {
return contact;
}
public Contact getContact() {
return contact.get();
}
public void setContact(Contact contact) {
this.contact.set(contact);
}
@Override
public int hashCode() {
int hash = 5;
hash = 89 * hash + Objects.hashCode(this.ddt);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final DDTTableView other = (DDTTableView) obj;
if (!Objects.equals(this.ddt, other.ddt)) {
return false;
}
return true;
}
}
的DDT豆:
public class DDT {
....
private ObjectProperty<ObservableList<DDTItem>> rows;
....
}
public DDT() {
....
this.rows = new SimpleObjectProperty<>(FXCollections.observableArrayList());
....
}
public ObjectProperty<ObservableList<DDTItem>> getRowsProperty() {
return rows;
}
public ObservableList<DDTItem> getRows() {
return rows.get();
}
public void setRighe(ObservableList<DDTItem> r) {
this.rows.set(r);
}
....
}
最後的入口點中,我將我的數據傳遞給控制器:
public void setMainApp(AppWindow mainApp, MDIWindow win, MDICanvas can) {
super.setMainApp(mainApp, win, can);
dataManager.getDDT().stream().forEach((ddt) -> {
actualDDT.add(new DDTTableView(ddt));
});
}
你可以看到我只使用第二個構造函數(帶參數的那個)。
現在的問題是,即使在DDT bean中更新了Rows屬性,Rif屬性也不會被重建,因爲ChangeListener不會觸發,我不明白爲什麼。
任何人都可以請一些光?
謝謝。
你的意思是你更新調用'setRighe()'的行屬性嗎?這實際上應該工作。當更改監聽器沒有觸發時,通常情況下,由於引用較弱,該屬性會收集垃圾。但是因爲你的所有屬性都存儲在字段中,所以這不應該成爲問題。 – Calculator