首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么javafx8 UI线程在变更列表中表现得很奇怪?

为什么javafx8 UI线程在变更列表中表现得很奇怪?
EN

Stack Overflow用户
提问于 2017-05-25 19:37:09
回答 1查看 33关注 0票数 1

我正在创建一个基于用户输入通过选择框提供的条形图。在选项框中更改侦听器,我首先创建一个数据序列,然后创建条形图。然而,图表没有正确地呈现,也就是说,有些时候没有条形图,有些时候,条形图的长度与数据不一样。但是,当我通过让UI线程进入睡眠而在数据创建和图表创建之间添加一个短暂的延迟时,它工作得很好。

我的问题是,为什么会这样?为什么UI线程没有在创建图表之前等待数据创建过程完成?有没有办法做到这一点而不增加延迟?下面是更改侦听器的代码片段。

代码语言:javascript
复制
numberOfBars.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
   createData(newValue);
   // It works fine if I add Thread.sleep(1000) here. Why?
   createBarChart();
});

完整的代码如下:

代码语言:javascript
复制
public class Main extends Application {
    private XYChart.Series<String, Number> data = new XYChart.Series<>();
    private VBox vBox = new VBox();
    private Pane bcContainer = new Pane();
    @Override public void start(Stage stage){
        ChoiceBox<Integer> numberOfBars = new ChoiceBox<>();
        ObservableList<Integer> items = FXCollections.observableArrayList(5, 10);
        numberOfBars.setItems(items);
        vBox.getChildren().addAll(new Label("Number of bars: "), numberOfBars, new Separator(), bcContainer);
        numberOfBars.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
            createData(newValue);
            // It works fine if I add Thread.sleep(1000) here. Why?
            createBarChart();
        });
        Scene scene  = new Scene(vBox,800,600);
        stage.setScene(scene);
        stage.show();
    }
    private void createData(int bars){
        ObservableList<XYChart.Data<String, Number>> observableList = FXCollections.observableArrayList();
        for (int i=0; i<bars; i++) {
            observableList.add(new XYChart.Data<>("bar" + Integer.toString(i), i+1));
        }
        data.setData(observableList);
    }
    private void createBarChart(){
        BarChart<String, Number> barChart= new BarChart<>(new CategoryAxis(), new NumberAxis());
        barChart.setLegendVisible(false);
        barChart.setPrefSize(800, 500);
        barChart.getData().add(data);
        bcContainer.getChildren().clear();
        bcContainer.getChildren().add(barChart);
    }
    public static void main(String[] args) {
        launch(args);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-25 19:43:41

看起来像虫子..。(在图表API中,我并不完全感到惊讶)。

如果你关掉动画,它看起来会很好。打电话

代码语言:javascript
复制
barChart.setAnimated(false);

在创建条形图后立即。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44188544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档