Привязка StringProperty к позиции в списке Javafx

Я пытаюсь создать ObservableList() для использования с моим Tableview. Тип StringData — это класс, содержащий две переменные SimpleStringProperty var. Я хочу создать этот список и привязать каждую переменную к определенной позиции списка. Что-то вроде этого:

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. Я считаю, что он должен обновлять значение столбца, связанного с переменной state и sinc, каждый раз, когда DownloadService обновляет содержимое списка в каждой позиции. Я делаю что-то не так или есть другой способ привязать StringProperty к позиции в списке?

Спасибо!


person Daniel Epstein    schedule 01.07.2016    source источник
comment
выложите полный код пожалуйста   -  person DVarga    schedule 01.07.2016
comment
Спасибо за попытку помочь. @whitesite решил мою проблему.   -  person Daniel Epstein    schedule 04.07.2016


Ответы (1)


Вы привязываетесь к конкретному объекту внутри списка, а не к позиции. Если использование SimpleStringProperty в dList не является строгим требованием, вы можете использовать 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);
    }
}
person whitesite    schedule 02.07.2016