1
我正在根據通過選擇框提供的用戶輸入創建條形圖。在選擇框更改偵聽器內部,我首先創建一個數據系列,然後創建條形圖。但是,圖表不能正確顯示,即有一段時間沒有條形圖,有時候條形圖的長度與數據不一致。但是,當通過將UI線程置於睡眠狀態而在數據創建和圖表創建之間添加短暫延遲時,它可以正常工作。爲什麼javafx8 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);
}
}
謝謝James_D,你讓我的一天。我花了兩天時間弄清楚爲什麼地球上這不起作用。不勝感激。 – Adnan