我正在创建一个基于用户输入通过选择框提供的条形图。在选项框中更改侦听器,我首先创建一个数据序列,然后创建条形图。然而,图表没有正确地呈现,也就是说,有些时候没有条形图,有些时候,条形图的长度与数据不一样。但是,当我通过让UI线程进入睡眠而在数据创建和图表创建之间添加一个短暂的延迟时,它工作得很好。
我的问题是,为什么会这样?为什么UI线程没有在创建图表之前等待数据创建过程完成?有没有办法做到这一点而不增加延迟?下面是更改侦听器的代码片段。
numberOfBars.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
createData(newValue);
// It works fine if I add Thread.sleep(1000) here. Why?
createBarChart();
});完整的代码如下:
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);
}
}发布于 2017-05-25 19:43:41
看起来像虫子..。(在图表API中,我并不完全感到惊讶)。
如果你关掉动画,它看起来会很好。打电话
barChart.setAnimated(false);在创建条形图后立即。
https://stackoverflow.com/questions/44188544
复制相似问题