Hallo!
ich habe eine Tabelle, in die Informationen über eine Datei gespeichert wird (Name, Typ, usw.). Es funktioniert einwandfrei, dass ich die Informationen in eine DB speichere und mir die Informationen zur Darstellung in der Tabelle wieder aus der DB entnehme.
Problem:
Die Tabelle befindet sich auf einer Stage. In einer andere Stage lösche ich in einem bestimmten Fall alle Informationen zu den Dateien aus der DB und möchte nun auch, dass die Daten aus der Tabelle gelöscht werden, bzw. in der ersten Stage soll die Tabelle wieder als leer angezeigt werde.
Die Informationen werden zwar aus der DB gelöscht, aber sobald die zweite Stage schließt, zeigt die Tabelle weiterhin die alten Datei-Informationen an
Ich habe es mit synchronized vesucht, was bei einer anderen Stelle in meinem Projekt geholfen hat, hier klappt es allerdings nicht..
[CODE lang="java" title="Stage mit Tabelle"]public class Stage1 extends Thread implements Initializable{
@FXML
public TableColumn tableFile;
@FXML
private TableColumn tableDate;
@FXML
private TableColumn tableType;
@FXML
private TableColumn tableSize;
@FXML
public TableView tableView;
public static boolean waitDeleteTableView = false;
@Override
public void initialize(URL url, ResourceBundle rb) {
List<OriginalFile> filesTable = new ArrayList<>();
try {
filesTable = originalFileTable.getOriginalFilesForTable(); //DB abfrage
} catch (SQLException ex) {
Logger.getLogger(Stage1.class.getName()).log(Level.SEVERE, null, ex);
}
if (filesTable != null) {
for (int i = 0; i < filesTable.size(); i++) {
try {
addTableViewEntry(filesTable.get(i).getName(), filesTable.get(i).getDate(), filesTable.get(i).getType(), filesTable.get(i).getSize());
} catch (SQLException ex) {
Logger.getLogger(Stage1.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
public saveTableEntry(ActionEvent e) {
TableViewItem item;
String data;
TableColumn col = tableFile;
for (int i = 0; i < tableView.getItems().size(); i++) {
item = (TableViewItem) tableView.getItems().get(i);
data = (String) col.getCellObservableValue(item).getValue();
if (data.equals(fileName)) {
TableViewItem selectedItem = (TableViewItem) tableView.getItems().get(i);
tableView.getItems().remove(selectedItem);
}
addTableViewEntry(originalFileTable.getLastEntryName(), originalFileTable.getLastEntryDate(), originalFileTable.getLastEntryType(), originalFileTable.getLastEntrySize());
}
public void addTableViewEntry(String file, String date, String type, String size) throws SQLException {
//Erstellen einer Tabellenzeile für die eingefügte Datei
tableFile.setCellValueFactory(new PropertyValueFactory<TableViewItem, String>("file"));
tableDate.setCellValueFactory(new PropertyValueFactory<TableViewItem, String>("date"));
tableType.setCellValueFactory(new PropertyValueFactory<TableViewItem, String>("type"));
tableSize.setCellValueFactory(new PropertyValueFactory<TableViewItem, String>("size"));
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
LocalDateTime now = LocalDateTime.now();
tableView.getItems().add(new TableViewItem(file, date, type, size));
}
public void deleteTableView() {
Stage2 config = new Stage2();
synchronized (config) {
try {
while(waitDeleteTableView) {
config.wait();
}
} catch (InterruptedException ex) {
Logger.getLogger(Stage1.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println(config.deleteTableView);
if(config.deleteTableView) {
/* boolean bleibt auf false, obwohl es in Stage2 auf true gesetzt wird
zum testen habe ich auch schon versucht es von anfang an auf true zusetzten, aber dann bekomme ich von dem TableView eine nullpointer-exception bei dem .clear()
*/
tableView.getItems().clear();
}
}
}[/CODE]
[CODE lang="java" title="Stage 2"]public class Stage2 implements Initializable {
public boolean deleteTableView = false;
Stage1 stage1 = new Stage1();
public void deleteTableViewEntries(){
if(Bedingung) { //ist auf jeden fall erfüllt
stage1.deleteTableView();
synchronized (this) {
Stage1.waitDeleteTableView = true;
deleteTableView = true;
notify();
Stage1.waitDeleteTableView = false;
}
}
}
}[/CODE]
Eine weitere Möglichkeit, die ich in Betracht gezogen habe, aber nichts passendes gefunden habe:
Stage1 irgendwie reloaden oder sowas in der Art, aber eben irgendwie von der Stage2 aus.
Ich hoffe der Code-Teil reicht zum Verständnis aus und ihr könnt mir irgendwie helfen!
ich habe eine Tabelle, in die Informationen über eine Datei gespeichert wird (Name, Typ, usw.). Es funktioniert einwandfrei, dass ich die Informationen in eine DB speichere und mir die Informationen zur Darstellung in der Tabelle wieder aus der DB entnehme.
Problem:
Die Tabelle befindet sich auf einer Stage. In einer andere Stage lösche ich in einem bestimmten Fall alle Informationen zu den Dateien aus der DB und möchte nun auch, dass die Daten aus der Tabelle gelöscht werden, bzw. in der ersten Stage soll die Tabelle wieder als leer angezeigt werde.
Die Informationen werden zwar aus der DB gelöscht, aber sobald die zweite Stage schließt, zeigt die Tabelle weiterhin die alten Datei-Informationen an
Ich habe es mit synchronized vesucht, was bei einer anderen Stelle in meinem Projekt geholfen hat, hier klappt es allerdings nicht..
[CODE lang="java" title="Stage mit Tabelle"]public class Stage1 extends Thread implements Initializable{
@FXML
public TableColumn tableFile;
@FXML
private TableColumn tableDate;
@FXML
private TableColumn tableType;
@FXML
private TableColumn tableSize;
@FXML
public TableView tableView;
public static boolean waitDeleteTableView = false;
@Override
public void initialize(URL url, ResourceBundle rb) {
List<OriginalFile> filesTable = new ArrayList<>();
try {
filesTable = originalFileTable.getOriginalFilesForTable(); //DB abfrage
} catch (SQLException ex) {
Logger.getLogger(Stage1.class.getName()).log(Level.SEVERE, null, ex);
}
if (filesTable != null) {
for (int i = 0; i < filesTable.size(); i++) {
try {
addTableViewEntry(filesTable.get(i).getName(), filesTable.get(i).getDate(), filesTable.get(i).getType(), filesTable.get(i).getSize());
} catch (SQLException ex) {
Logger.getLogger(Stage1.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
public saveTableEntry(ActionEvent e) {
TableViewItem item;
String data;
TableColumn col = tableFile;
for (int i = 0; i < tableView.getItems().size(); i++) {
item = (TableViewItem) tableView.getItems().get(i);
data = (String) col.getCellObservableValue(item).getValue();
if (data.equals(fileName)) {
TableViewItem selectedItem = (TableViewItem) tableView.getItems().get(i);
tableView.getItems().remove(selectedItem);
}
addTableViewEntry(originalFileTable.getLastEntryName(), originalFileTable.getLastEntryDate(), originalFileTable.getLastEntryType(), originalFileTable.getLastEntrySize());
}
public void addTableViewEntry(String file, String date, String type, String size) throws SQLException {
//Erstellen einer Tabellenzeile für die eingefügte Datei
tableFile.setCellValueFactory(new PropertyValueFactory<TableViewItem, String>("file"));
tableDate.setCellValueFactory(new PropertyValueFactory<TableViewItem, String>("date"));
tableType.setCellValueFactory(new PropertyValueFactory<TableViewItem, String>("type"));
tableSize.setCellValueFactory(new PropertyValueFactory<TableViewItem, String>("size"));
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
LocalDateTime now = LocalDateTime.now();
tableView.getItems().add(new TableViewItem(file, date, type, size));
}
public void deleteTableView() {
Stage2 config = new Stage2();
synchronized (config) {
try {
while(waitDeleteTableView) {
config.wait();
}
} catch (InterruptedException ex) {
Logger.getLogger(Stage1.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println(config.deleteTableView);
if(config.deleteTableView) {
/* boolean bleibt auf false, obwohl es in Stage2 auf true gesetzt wird
zum testen habe ich auch schon versucht es von anfang an auf true zusetzten, aber dann bekomme ich von dem TableView eine nullpointer-exception bei dem .clear()
*/
tableView.getItems().clear();
}
}
}[/CODE]
[CODE lang="java" title="Stage 2"]public class Stage2 implements Initializable {
public boolean deleteTableView = false;
Stage1 stage1 = new Stage1();
public void deleteTableViewEntries(){
if(Bedingung) { //ist auf jeden fall erfüllt
stage1.deleteTableView();
synchronized (this) {
Stage1.waitDeleteTableView = true;
deleteTableView = true;
notify();
Stage1.waitDeleteTableView = false;
}
}
}
}[/CODE]
Eine weitere Möglichkeit, die ich in Betracht gezogen habe, aber nichts passendes gefunden habe:
Stage1 irgendwie reloaden oder sowas in der Art, aber eben irgendwie von der Stage2 aus.
Ich hoffe der Code-Teil reicht zum Verständnis aus und ihr könnt mir irgendwie helfen!