【问题标题】:JavaFX Service not succeedingJavaFX 服务未成功
【发布时间】:2022-12-15 13:21:39
【问题描述】:

我试图找到与 SwingWorkerService 类非常接近的 JavaFX 等价物。我正在尝试使用后台任务在 ImageView() 中加载图像,当任务成功时,按钮 appMode 将使用 ImageView 作为图标。但我的问题是,服务类总是设置在SCHEDULED 上,阻止setOnSucceeded() 运行。 (我从 here 获取了服务代码

import javafx.scene.image.ImageView;
import javafx.scene.image.Image;
import javafx.scene.control.ToggleButton;
import javafx.fxml.FXML;

@FXML
private ToggleButton appMode;

@Override
public void initialize(URL url, ResourceBundle rb){
    Service<Boolean> process=new Service<>(){
        @Override
        protected Task<Boolean> createTask<>(){
            return new Task<>(){
                @Override
                protected Boolean call(){
                    Boolean val=false;
                    try{
                        light=new ImageView();
                        lightImg=new Image(App.class.getResourceAsStream("iconindicators/light.png"));
                        light.setImage(lightImg);
                        val=true;
                    }catch(Exception ex){
                        System.out.println(ex);
                    }
                    return val;
                }
            };
        }
    };
    process.setOnSucceeded(e->{
        if(process.getValue()){
            appMode.setGraphic(light);
        }else{
            System.out.println("Failed.");
        }
    });
    process.start();
}

【问题讨论】:

    标签: service task fxml


    【解决方案1】:

    看起来我不需要 Service,而 Task 就足够了:

    Task<Boolean>work=new Task<>(){
        @Override
        protected Boolean call(){
            Boolean done=false;
            try{
                light=new javafx.scene.image.ImageView();
                lightImg=new javafx.scene.image.Image(App.class.getResourceAsStream("iconindicators/light.png"));
                light.setImage(lightImg);
                done=true;
            }catch(Exception ex){
                System.out.println(ex);
            }
            return done;
        }
    };
    new Thread(work).start();
    work.setOnSucceeded(e->{
        try{
            if(work.get()){
                appMode.setGraphic(light);
            }else{
                System.out.println("fail");
            }
        }catch(Exception ex){
            System.out.println(ex);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2016-07-22
      • 2013-06-04
      相关资源
      最近更新 更多