Hi zusammen,
ich hatte zu der Verzeichnisüberwachung schon ein Thema erstellt, doch jetzt komme ich nicht mehr weiter:
Der WatchService funktioniert soweit aber er will das Bild einfach nicht anzeigen. Von nem Kumpel habe ich erfahren, dass Windows manchmal ein bisschen braucht um das Bild sozusagen bereit zu stellen, aber selbst wenn ich den Thread ein paar Sekunden schlafen lasse, bevor er das Bild laden soll (über eine selbstgeschriebene Methode) oder eine While schleife mache, die den Ladevorgang wiederholt, bis er funktioniert, lädt da nix... Über Systemausgaben habe ich die Zeile lokalisiert, bei der er hakt, aber das verwirrt mich nur noch mehr...
Also hier der Code:
- Die Methode newPicture() funkioniert einwandfrei, so werden eine gesetzte Anzahl der Bilder bei Programmstart geladen und auch per "Refresh-button", der diese Methode auslöst, hat immer alles geklappt.
- Der newFileListenerThread funktioniert soweit, dass er erkennt, wenn eine neue Datei im entsprechenden Ordner ist und über die Systemausgabe habe ich rausgefunden, dass der Thread genau bis zum methodenaufruf von newPicture() kommt und dann nicht weiter.
- Wenn newPicture() von dem Thread aufgerufen wird, spuckt das Programm "bis hier1" aus, "bis hier2" aber nicht mehr. Von den Fehlern wird keiner ausgespuckt...
Könnt ihr mir weiterhelfen?
Danke!!!
ich hatte zu der Verzeichnisüberwachung schon ein Thema erstellt, doch jetzt komme ich nicht mehr weiter:
Der WatchService funktioniert soweit aber er will das Bild einfach nicht anzeigen. Von nem Kumpel habe ich erfahren, dass Windows manchmal ein bisschen braucht um das Bild sozusagen bereit zu stellen, aber selbst wenn ich den Thread ein paar Sekunden schlafen lasse, bevor er das Bild laden soll (über eine selbstgeschriebene Methode) oder eine While schleife mache, die den Ladevorgang wiederholt, bis er funktioniert, lädt da nix... Über Systemausgaben habe ich die Zeile lokalisiert, bei der er hakt, aber das verwirrt mich nur noch mehr...
Also hier der Code:
Java:
// Neuer FXThread, der den Ordner C:/Bilder auf neue Einträge überwacht
newFileListenerThread = new Service<Void>() {
protected Task<Void> createTask() {
return new Task<Void>(){
@Override
protected Void call() throws Exception {
WatchService watcher= FileSystems.getDefault().newWatchService();
Path dir = Paths.get("C:/Bilder");
for (;;) {
WatchKey key = null;
key = dir.register(watcher, ENTRY_CREATE);
for (WatchEvent<?> event: key.pollEvents()) {
event.kind();
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>)event;
Path filename = ev.context();
System.out.println("new file: "+filename+ " imageCounter= "+ imageCounter);
if(filename.toString().equals("foto ("+(imageCounter+1)+").jpg")){
newPictureSucceeded = false;
long starttime = System.currentTimeMillis(), deltatime = 0;
int i = 1;
while(!newPictureSucceeded && deltatime<10000){
System.out.println("try "+ i);
newPicture();
System.out.println("after newPicture");
deltatime = System.currentTimeMillis() - starttime;
i++;
}
}
}
boolean valid = key.reset();
if (!valid) {
break;
}
}
return null;
}
};
}
};
newFileListenerThread.restart();
//Bilder hinzufügen
private void newPicture() {
try{
image = new Image(new FileInputStream("C:/Bilder/foto ("+(imageCounter+1)+ ").jpg"), imageWidth*2/3, 0, true, true);
pics.add(new ImageView(image));
pics.get(imageCounter).setFitWidth(imageWidth);
pics.get(imageCounter).setPreserveRatio(true);
if(imageCounter%4==0){
hboxCounter++;
hboxes.add(new HBox(borderWidth));
vbox.getChildren().add(hboxes.get(hboxCounter));
scrollbar.setMax((imageHeight+borderWidth)*(hboxCounter+1)-(Toolkit.getDefaultToolkit().getScreenSize().height));
}
System.out.println("bis hier1");
hboxes.get(hboxCounter).getChildren().add(pics.get(imageCounter));
System.out.println("bis hier2");
imageCounter++;
scrollbar.setValue(scrollbar.getMax());
newPictureSucceeded = true;
}
catch(NullPointerException e){
System.out.println("fehler 1");
}
catch(FileNotFoundException e){
System.out.println("fehler 2");
}
}
- Die Methode newPicture() funkioniert einwandfrei, so werden eine gesetzte Anzahl der Bilder bei Programmstart geladen und auch per "Refresh-button", der diese Methode auslöst, hat immer alles geklappt.
- Der newFileListenerThread funktioniert soweit, dass er erkennt, wenn eine neue Datei im entsprechenden Ordner ist und über die Systemausgabe habe ich rausgefunden, dass der Thread genau bis zum methodenaufruf von newPicture() kommt und dann nicht weiter.
- Wenn newPicture() von dem Thread aufgerufen wird, spuckt das Programm "bis hier1" aus, "bis hier2" aber nicht mehr. Von den Fehlern wird keiner ausgespuckt...
Könnt ihr mir weiterhelfen?
Danke!!!