什么使JavaFx 2任务成功/失败

时间:2013-10-04 21:09:37

标签: java multithreading javafx-2 task

我有一个任务,可以查看Navison并返回一个ObservableList或Null 无论查找是否成功且列表是否填充,任务总是调用failed()而从不调用()! 任何想法为什么会发生这种情况? 这是我的任务:

    public class LoadLocsTask extends Task<Void>{
    Button button;
    @Override protected Void call() throws Exception {

            ObservableList<String> list = application.getValidator().getLocList(button.getText());
            if(list != null){
                locationList.setItems(list);
            }else{
                Dialogs.showErrorDialog(application.getPrimaryStage(),"An error occured while retrieving the loaction list from navision.", "Please contact IS department", "Unable To Populate Location List");
                locationList.setItems(null);
            }
        return null;    
    }

    @Override protected void succeeded() {
        super.succeeded();
        selectProgressIndicator.setVisible(false);
        disableSelected(button);

    }
    @Override protected void failed() {
        super.failed();
        selectProgressIndicator.setVisible(false);
        disableSelected(button);

    }
    @Override protected void scheduled() {
        super.scheduled();
        locationList.getSelectionModel().clearSelection();
        locationList.setItems(null);
        selectProgressIndicator.setVisible(true);
        disableAll();

    }
    @Override protected void cancelled() {
        super.cancelled();
        logger.info("Cancelled");
        locationList.setItems(null);
        selectProgressIndicator.setVisible(true);

    }

这是application.getValidator()。getLocList(button.getText())

public ObservableList<String> getLocList(String selectedLoc) {
    ObservableList<String> binsOL = null;
    String warehouseCode = null;
    if (selectedLoc.equalsIgnoreCase("location1")) {
        warehouseCode = "LOCATION1";
    } else if (selectedLoc.equalsIgnoreCase("location2")) {
        warehouseCode = "LOCATION2";
    } else if (selectedLoc.equalsIgnoreCase("location3")) {
        warehouseCode = "LOCATION3";
    } else if (selectedLoc.equalsIgnoreCase("location4")) {
        warehouseCode = "LOCATION4";
    } else if (selectedLoc.equalsIgnoreCase("location5")) {
        warehouseCode = "LOCATION5";
    } 

    if (warehouseCode != null) {
        try {
            binsOL = FXCollections.observableArrayList();
            Bins[] bins = navWebservice.getBinsList(warehouseCode);
            for (Bins bin : bins) {
                binsOL.add(bin.getCode());
            }
        } catch (RemoteException e) {
            logger.error("LocationSelectionController - processLocButton(): Could not generate list for " + warehouseCode + " button", e);
            Dialogs.showErrorDialog(parentApp.getPrimaryStage(), e.getMessage(), "Please contact IS department", "Unable To Populate Location List");

        }
    }
    return binsOL;

}

提前致谢!!!

1 个答案:

答案 0 :(得分:1)

您的代码不是线程安全的,您不应在任务调用方法中显示对话框和更新列表视图中的项目,而不将这些操作包装在Platform.runLater中。

有关详细信息,请搜索Platform.runLater和JavaFX并发的stackoverflow: