2017-05-25 46 views
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); 
    } 
} 

回答

2

這看起來像一個bug ......(圖表API中,我並不完全感到意外)。

如果關閉動畫,它似乎可以正常工作。致電

barChart.setAnimated(false); 

創建條形圖後立即。

+0

謝謝James_D,你讓我的一天。我花了兩天時間弄清楚爲什麼地球上這不起作用。不勝感激。 – Adnan

相關問題