javaFX 在for循环中执行代码,使tableview单行依次实时刷新更新数据的解决方案

来源:互联网 发布:网络精准投放 编辑:程序博客网 时间:2024/05/20 16:11

1.解决Javafx 在非UI线程中更新UI数据的操作需要用到Task
2.解决Javafx 实时更新数据,需要监听,使用callback

原先我的Atie工具执行批量case测试,只能全部执行完刷新tableview,现在可以执行一条自动刷新一条了,完整代码参考码云

关键代码如下:

@FXMLTableColumn<TableModel, Label> tableResponse;@FXMLTableColumn<TableModel, Label> tableResult;
tableResult.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<TableModel, Label>, ObservableValue<Label>>() {        @Override        public ObservableValue<Label> call(CellDataFeatures<TableModel, Label> param) {            String val = "Empty";            if (param != null && param.getValue() != null) {            val = param.getValue().getResult();            }            final Label label = new Label(val);            try {                label.setText(param.getValue().getResult());                param.getValue().ResultProperty().addListener(new ChangeListener<String>() {                @Override                public void changed(ObservableValue<? extends String> observable, String oldValue,String newValue) {Platform.runLater(() -> label.setText(newValue));                }});                } catch (Exception e) {                    e.printStackTrace();                }        return new SimpleObjectProperty<Label>(label);}});tableResponse.setCellValueFactory(                new Callback<TableColumn.CellDataFeatures<TableModel, Label>, ObservableValue<Label>>() {                    @Override                    public ObservableValue<Label> call(CellDataFeatures<TableModel, Label> param) {                        String val = "Empty";                        if (param != null && param.getValue() != null) {                            val = param.getValue().getResponse();                        }                        final Label label = new Label(val);                        try {                            label.setText(param.getValue().getResponse());                            param.getValue().ResponseProperty().addListener(new ChangeListener<String>() {                                @Override                                public void changed(ObservableValue<? extends String> observable, String oldValue,                                        String newValue) {                                    System.out.println(CurrentTime() + " ObservableValue222; " + newValue);                                    Platform.runLater(() -> label.setText("-->" + newValue));                                }                            });                        } catch (Exception e) {                            e.printStackTrace();                        }                        return new SimpleObjectProperty<Label>(label);                    }                });
@FXMLpublic void testAll() throws InterruptedException {    Task<Void> progressTask = new Task<Void>() {        @Override        protected Void call() throws Exception {            for (int i = 0; i < CasesTable.getItems().size(); i++) {                casename = lt.get(i).CasenameProperty().getValue();                at = lt.get(i).ATCommandProperty().getValue();                expe = lt.get(i).ExpectionProperty().getValue();                sendAT(at);                lt.get(i).setResponse(resp);                System.out.println(CurrentTime() + " sendAT(at); " + at);                if (resp.trim().endsWith("OK")) {                    lt.get(i).setResult("pass");                } else {                    lt.get(i).setResult("fail");                }                Thread.sleep(500);                resp = "";                }            return null;            }        };        th = new Thread(progressTask);        th.start();    }

现在执行,对应的 response和result就会自动一行行的刷新
这里写图片描述

阅读全文
0 0