Hi,
ich habe eine mittlerweile lauffähige Anwendung die je nachdem welchen Button ich anklicke eine SQL DB Abfrage macht und das Ergebnis in eine TableView schreibt.
Leider habe ich den UI und DB Thread ziemlich vermischt und weiß nicht wie ich die am besten trennen kann damit ich neben der Abfrage und dem befüllen der TableView die GUI mit einem Ladebalken oder einer anderen Animation ständig updaten kann bis alles fertig ist.
TreeView mit der Auswahl der einzelnen Abfragen:
pIVisible()
AuswahlClicked()
buildData(); // -> DB-Abfrage und TableView updaten...
Wie kann ich die buildData() so anpassen das der progressBar updated während die Abfrage noch läuft? Und dann nat. fertig ist wenn die Abfrage und das befüllen der TableView fertig ist.
ich hoffe ich habe das Problem halbwegs verständlich erklärt
danke im Voraus für eure Hilfe,
ich habe eine mittlerweile lauffähige Anwendung die je nachdem welchen Button ich anklicke eine SQL DB Abfrage macht und das Ergebnis in eine TableView schreibt.
Leider habe ich den UI und DB Thread ziemlich vermischt und weiß nicht wie ich die am besten trennen kann damit ich neben der Abfrage und dem befüllen der TableView die GUI mit einem Ladebalken oder einer anderen Animation ständig updaten kann bis alles fertig ist.
TreeView mit der Auswahl der einzelnen Abfragen:
Java:
.
.
public static ObservableList<ObservableList<String>> data = FXCollections.observableArrayList();
public static ObservableList<String> row = FXCollections.observableArrayList();
.
.
@FXML
TableView tableview1;
.
.
public void BuildTreeView() {
.
.
************************************************************************************************** */
treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldVal, Object newVal) {
System.out.println(oldVal + " neuer: " + newVal);
switch (newVal.toString()) {
case "TreeItem [ value: USW ]":
sqlDatei = "USW.txt";
xlsxSheetName = sqlDatei.substring(0, sqlDatei.lastIndexOf('.'));
pIVisible();
AuswahlClicked();
buildData();
break;
case "TreeItem [ value: GHA ]":
sqlDatei = "gha.txt";
AuswahlClicked();
buildData();
break;
.
.
.
pIVisible()
Java:
public void pIVisible() {
Platform.runLater(new Runnable() {
public void run() {
progressBarStatus.setVisible(true);
labelStatus.setText("loading...");
}
});
}
AuswahlClicked()
Hier lade ich das jeweilige SQL Statement aus einer Textdatei
buildData(); // -> DB-Abfrage und TableView updaten...
Java:
public void buildData() {
tableview1.getItems().clear();
tableview1.getColumns().clear();
System.out.println("index: " + data.indexOf(c));
try {
c = DB._DB_Connection.getConnection();
System.out.println("real SQL: " + SQL);
ResultSet rs = c.createStatement().executeQuery(SQL);
TableColumn col = new TableColumn();
for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
//making dynamic table
final int j = i;
col = new TableColumn(rs.getMetaData().getColumnName(i + 1));
col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) {
// System.out.println("param.getValue(): " + param.getValue().toString());
return new SimpleStringProperty(param.getValue().get(j).toString());
}
});
int rowNr = i + 1;
System.out.println("Column [" + rowNr + "] " + rs.getMetaData().getColumnName(rowNr));
tableview1.getColumns().addAll(col);
}
/* Data added to ObservableList */
while (rs.next()) {
//Iterate Row
row = FXCollections.observableArrayList();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
Object o = rs.getObject(i);
row.add(o == null ? "" : o.toString()); // wenn ein NULL Value gefunden wird, wird dieser durch "" ersetzt
}
data.addAll(row);
System.out.println("row: " + row.get(0));
}
Platform.runLater(() -> tableview1.setItems(data));
ausgabe1.setText("" + data.size());
System.out.println("Anzahl der Zeilen: " + data.size());
// RechtsklickMenü in TableView initialisieren!
RechtsKlickMenue();
rs.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error on Building Data");
}
}
Wie kann ich die buildData() so anpassen das der progressBar updated während die Abfrage noch läuft? Und dann nat. fertig ist wenn die Abfrage und das befüllen der TableView fertig ist.
ich hoffe ich habe das Problem halbwegs verständlich erklärt
danke im Voraus für eure Hilfe,