2013-11-02 24 views
0

現在是另一個問題發生了,似乎我使用的查詢只是第一次工作,但在按下一個/上一個按鈕後,它給了我一些其他的東西!BarChart更新

這裏是我使用的查詢:

for (int i = 0; i <= months.length + 1; i++) { 
     try { 
      String a; 
      if (i < 9) { 
       a = y + "0" + (i + 1); 
      } else { 
       a = y + "" + (i + 1); 
      } 
      System.out.println("Année Courante " + a); 
      conn = DBConnection.connect(); 
      String sql = "select sum(montant_operation) from operations where (select Extract(YEAR_MONTH from date_operation)) = '" + a + "' and typ_operation ='Versement';"; 
      final ResultSet rs = conn.prepareStatement(sql).executeQuery(); 
      if (rs.next()) { 
       System.out.println(series1.getData().toString()); 
       series1.getData().add(new XYChart.Data<>(months[i], rs.getFloat("sum(montant_operation)"))); 
      } 
     } catch (SQLException e) { 
      System.out.println(e); 
     } 
    } 

但有工作正常一次查詢,然後提示錯誤。

有一個愉快的一天

回答

0

在你BuildData(順便說一下,不是下面的Java命名約定,更改其名稱),方法要更新系列的數據。用相同的方法將這個系列添加到圖表中。通過點擊「下一步」按鈕,BuildData方法被再次添加,這是不必要的。刪除

Platform.runLater(() -> { 
    barchart.getData().add(series1); 
}); 

部分從方法和啓動添加圖表只有一次:

... 
... 
vbox.getChildren().addAll(box, barchart); 
barchart.getData().add(series1); 
pane.getChildren().add(vbox); 
... 
... 

的測試SSCCE:

import java.util.Calendar; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.geometry.Orientation; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.chart.BarChart; 
import javafx.scene.chart.CategoryAxis; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.scene.control.Button; 
import javafx.scene.layout.FlowPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class BarChartDemo extends Application { 

    final String[] months = {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"}; 
    //Connection conn; 
    final CategoryAxis month_axis = new CategoryAxis(); 
    final NumberAxis data_axis = new NumberAxis(); 
    final XYChart.Series<String, Number> series1 = new XYChart.Series(); 
    private final BarChart<String, Number> barchart = new BarChart(month_axis, data_axis); 
    private Integer year = 0; 

    @Override 
    public void start(Stage primaryStage) { 
     year = Calendar.getInstance().get(Calendar.YEAR); 
     Button btn_next = new Button("NEXT"); 
     Button btn_previous = new Button("PREVIOUS"); 
     HBox box = new HBox(50); 
     box.getChildren().addAll(btn_previous, btn_next); 
     box.setAlignment(Pos.TOP_CENTER); 
     VBox vbox = new VBox(25); 
     box.setPadding(new Insets(10, 0, 10, 0)); 
     FlowPane pane = new FlowPane(Orientation.VERTICAL); 
     vbox.getChildren().addAll(box, barchart); 
     barchart.getData().add(series1); 
     pane.getChildren().add(vbox); 
     Scene scene = new Scene(pane); 
     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     BuildData(year); 
     btn_next.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       year += 1; 
       BuildData(year); 
      } 
     }); 
     btn_previous.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       year -= 1; 
       BuildData(year); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

    private void BuildData(Integer y) { 
     series1.setName("Versement"); 
     month_axis.setLabel("Mois de l'Année"); 
     month_axis.setStyle("-fx-font-weight:BOLD;" + "-fx-font-size:15"); 
     data_axis.setLabel("Valeur des Opérations Bancaires"); 
     data_axis.setStyle("-fx-font-weight:BOLD;" + "-fx-font-size:15"); 
     series1.getData().clear(); // clear old values 
     for (int i = 0; i < months.length; i++) { 
      series1.getData().add(new XYChart.Data(months[i], i * 10 * (y-2000))); 

//   try { 
//    String a; 
//    if (i < 9) { 
//     a = y + "0" + (i + 1); 
//    } else { 
//     a = y + "" + (i + 1); 
//    } 
//    conn = DBConnection.connect(); 
//    String sql = "select sum(montant_operation) from operations where (select Extract(YEAR_MONTH from date_operation)) = '" + a + "' and typ_operation ='Versement';"; 
//    final ResultSet rs = conn.prepareStatement(sql).executeQuery(); 
//    if (rs.next()) { 
//     series1.getData().add(new XYChart.Data<>(months[i], rs.getFloat("sum(montant_operation)"))); 
//    } 
//   } catch (SQLException e) { 
//    System.out.println(e); 
//   } 
     } 
    } 
} 
+0

我是一個有點困惑,玉可以使這樣我才能理解yu! – user2351866

+0

@ user2351866,我的意思是將代碼行'barchart.getData().add(series1);'從BuildData方法移入start方法。 –

+0

是的,做到了這一點,但仍然是同樣的問題! – user2351866