投标 StringProperty 在列表 Javafx 中的位置

Biding StringProperty to position in list Javafx

我正在尝试创建一个 ObservableList() 以与我的 Tableview 一起使用。 StringData 类型是一个 class 包含两个 SimpleStringProperty 变量。我想创建这个列表并将每个变量绑定到列表的特定位置。像这样:

public class DownloadService implements Runnable {
       //List that will be updated
       public List<SimpleStringProperty> dList = new ArrayList<SimpleStringProperty>();

public class MainScreenController implements Initializable {
    //List that populates TV    
    private ObservableList<DataString> data = FXCollections.observableArrayList();
    //tableview        
    @FXML
    private TableView<DataString> tbl_table;
    DownloadService download;
 ...}


public class DataString{

    public final SimpleStringProperty state;
    public final SimpleStringProperty sinc;

    public SimpleStringProperty stateProperty() {
        return state;
    }

    public void setState(String status) {
        state.set(status);
    }

    public SimpleStringProperty sincProperty() {
        return sinc;
    }

    public void setSinc(String sinc) {
        this.sinc.set(sinc);
    }
}

在 MainScreenController 上,我尝试这样做:

DataString s = new DataString();
s.state.bind (download.dList.get(data.size()));
s.sinc.bind (download.dList.get(data.size()));
data.add(s);

tbl_table.setItems(data);

但是,当我在DownloadService 上更新列表时,无法更新数据的内容。我相信每次 DownloadService 更新每个位置的列表内容时,它应该更新与 statesinc 变量关联的列的值。我做错了什么,或者有其他方法可以将 StringProperty 绑定到列表中的某个位置吗?

谢谢!

您正在绑定到列表中的特定对象,而不是位置。如果在 dList 中使用 SimpleStringProperty 不是严格要求,那么你可以使用 Bindings.stringValueAt():

StringBinding binding = Bindings.stringValueAt(dList, index);
s.state.bind(binding);

如果你真的需要SimpleStringProperty,你可以实现自定义StringBinding,像这样:

class CustomStringBinding extends StringBinding {

    private ObservableList<SimpleStringProperty> op;
    private int index;

    public CustomStringBinding(ObservableList<SimpleStringProperty> list, int index) {
        this.op = list;
        this.index = index;
        super.bind(op, op.get(index));
    }

    @Override
    public void dispose() {
        super.unbind(op, op.get(index));
    }

    @Override
    protected String computeValue() {
        try {
            return op.get(index).get();
        } catch (IndexOutOfBoundsException ex) {
            // log
        }
        return null;
    }

    @Override
    public ObservableList<?> getDependencies() {
        return FXCollections.singletonObservableList(op);
    }
}