Javafx:从ScheduledService中检索observableList单个元素,并将它们分别绑定到不同的属性

时间:2015-09-17 16:56:40

标签: java javafx

我正在努力刮掉谷歌财经。 getStockInfoFromGoogle方法存储两个字符串:(1)股票名称和(2)收盘价格为ObservableList<String>。这很好用。

然后我尝试使用ScheduledService在后​​台运行此方法,因此priceService应返回ObservableList<String>

当我尝试从ScheduledService方法中检索ObservableList<String>时,

出现问题,因为我无法从列表中单独提取字符串并将它们与lastValueProperty()相关联并且绑定到closingPrice属性。

我该如何解决这个问题? (我想在这里保留lastValueProperty())。

public class Trade{
    private final ReadOnlyStringWrapper stockName;
    private final ReadOnlyDoubleWrapper closingPrice;
private final ScheduledService<ObservableList<String>> priceService = new ScheduledService<ObservableList<String>>() {
    @Override
    public Task<ObservableList<String>> createTask(){
        return new Task<ObservableList<String>>() {
            @Override
            public Number call() throws InterruptedException, IOException {
                  return getStockInfoFromGoogle();
            }
        };
    }
};

// constructor
public Trade(){
    priceService.setPeriod(Duration.seconds(100));
    priceService.setOnFailed(e -> priceService.getException().printStackTrace());
    this.closingPrice = new ReadOnlyDoubleWrapper(0);
    this.stockName = new ReadOnlyStringWrapper("");

    // this is the part where things goes wrong for the two properties below
    this.closingPrice.bind(Double.parseDouble(priceService.lastValueProperty().get().get(1)));
    this.stockName.bind(priceService.lastValueProperty().get().get(0));

}

public ObservableList<String> getStockInfoFromGoogle() throws InterruptedException, IOException{
    ObservableList<String> output = FXCollections.observableArrayList();
    // do some web scraping
    output.add(googleStockName);
    output.add(googleClosingPrice);

    return output;

}

1 个答案:

答案 0 :(得分:1)

你的设计看起来很混乱,因为Trade类似乎都封装了一个交易(名称和价格),但似乎也在管理服务(它只是更新一个交易?)。

无论如何,在这里使用List是不可取的,你应该创建一个类来封装你从服务中获得的数据:

class TradeInfo {

    private final String name ;
    private final double price ;

    public TradeInfo(String name, double price) {
        this.name = name ;
        this.price = price ;
    }

    public String getName() {
        return name ;
    }

    public double getPrice() {
        return price ;
    }
}

现在让你的ScheduledService成为ScheduledService<TradeInfo>等,然后就可以了

public TradeInfo getStockInfoFromGoogle() throws InterruptedException, IOException{

    // do some web scraping
    return new TradeInfo(googleStockName, googleClosingPrice);

}

现在创建绑定:

this.closingPrice.bind(Bindings.createDoubleBinding(() -> 
    priceService.getLastValue().getPrice(),
    priceService.lastValueProperty());
this.stockName.bind(Bindings.createStringBinding(() ->
    priceService.getLastValue().getName(),
    priceService.lastValueProperty());

(您可能需要处理priceService.getLastValue()null的情况。)