投标 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 更新每个位置的列表内容时,它应该更新与 state 和 sinc 变量关联的列的值。我做错了什么,或者有其他方法可以将 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);
}
}
我正在尝试创建一个 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 更新每个位置的列表内容时,它应该更新与 state 和 sinc 变量关联的列的值。我做错了什么,或者有其他方法可以将 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);
}
}