schnixx Geschrieben 23. Mai 2012 Teilen Geschrieben 23. Mai 2012 Hallo zusammen, ich habe ein Tool geschrieben, welches eine xml-Datei auswertet und deren Inhalt darstellt. Nun möchte ich noch einen Button integrieren, anhand dessen es möglich ist, die xml-Datei aufzurufen und zu verändern. Das ganze soll im Notepad++ geschehen. Mein Problem ist nun, dass ich nicht weiß, wie die veränderte xml-Datei nach dem abspeichern direkt wieder neu vom Tool eingelesen wird, ohne das ich das Tool Neustarte (XML Datei verändern, speichern, schließen-> Tool besitzt sofort den neuen Inhalt) Habt Ihr Ideen, gibt es Lösungsvorschläge? Danke! JButton confButton = new JButton("Configure XML"); confButton.setEnabled(true); confButton.setToolTipText("Click this button to configure the xml-file"); confButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { String z; System.out.println("Button Configure XML betätigt!"); File xml = new File ("config.xml"); try { Runtime.getRuntime().exec("C:\\Program Files (x86)\\Notepad++\\notepad++.exe \"" + xml.getAbsolutePath() + "\""); } catch (IOException e) { // TODO Auto-generated catch block JOptionPane.showMessageDialog(null,"Cannot open sourcefile","ERROR", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } } }); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aliter Geschrieben 23. Mai 2012 Teilen Geschrieben 23. Mai 2012 Benutzt du JDK 7? Watching a Directory for Changes (The Javaâ„¢ Tutorials > Essential Classes > Basic I/O) 1. Klick auf "Configure XML" -> Watch Service starten (ENTRY_MODIFY) 2. Prüfen ob auch genau diese Datei ("config.xml") geändert wurde 3. Datei laden Theoretisch Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 24. Mai 2012 Autor Teilen Geschrieben 24. Mai 2012 Nein nutze ich nicht. Gibt es weitere Ideen/ Vorschläge?Komme derzeit nicht weiter. Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
blubbla Geschrieben 24. Mai 2012 Teilen Geschrieben 24. Mai 2012 Wenn du die Datei mit einem externen Programm bearbeitest, wirst du wohl nicht drum rum kommen, das XML-File zu beobachten und bei einer Änderung dein Hauptprogramm zu benachrichtigen. Mit dem Button, der auch Notepad++ startet, könntest du z.B. einen Listener starten, der die Datei mit normalen Boardmitteln überwacht (also das File auf Veränderung prüfen). Die Hauptanwendung ist dabei dann der Observer (siehe auch Observer-Pattern). Bei einer Änderung der Datei wird das Hauptprogramm aufgerufen und der Datei-Listener gleichzeitig wieder gelöscht.... naja so in etwa halt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
speedi Geschrieben 24. Mai 2012 Teilen Geschrieben 24. Mai 2012 (bearbeitet) Wenn du weißt wie die Datei heißt könntest du über myFile.lastModified das Datum der letzten Änderung abfragen. Lass doch einen Thread laufen der regelmäßig prüft, ob die Datei geändert wurde und ggf. diese neu einließt. Andere Möglichkeit: Runtime.getRuntime().exe(...) liefert dir ein Process-Objekt zurück. Von diesem könntest du dir den InputStream holen und versuchen zu lesen (da kommt wahrscheinlich nichts drüber rein, ist aber auch egal), denn sobald Notepad++ wieder geschlossen wird solltest du eine IOException bekommen oder anderweitig einen Fehler. Sobald der auftritt weißt du dann: Ok... Notepad++ geschlossen => datei neu laden. Bearbeitet 24. Mai 2012 von speedi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 24. Mai 2012 Autor Teilen Geschrieben 24. Mai 2012 Die Datei muss ja manuell verändert werden. Der Benutzer verändert die Datei und das Tool liest die Datei neu aus und erstellt anhand der veränderten xml Datei das Tool neu. Mein derzeitiges Problem liegt vor allem daran, dass die neu eingelesenen Werte an die alten angehängt werden. Dabei sollen die alten Werte eigl. nicht mehr vorhanden sein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
blubbla Geschrieben 24. Mai 2012 Teilen Geschrieben 24. Mai 2012 Naja, das kommt dann ganz darauf an, wie du die XML-Datei darstellst. GRundsätzlich sollte der Ablauf ja so sein: In der Java-Application Button drücken -> Notepad++ startet -> Listener, der die Datei überwacht, registrieren -> Java-Application hängt sich als Observer an den Listener -> Notepad++ speichert datei -> Listener benachrichtigt den Observer, dass die Datei geändert wurde -> der Observer, also die Java-Application, kümmert sich darum, dass die alte Darstellung des XML-Files gelöscht wird -> neues XML-File wird gelesen und angezeigt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 29. Mai 2012 Autor Teilen Geschrieben 29. Mai 2012 leider habe ich noch nicht mit listener und observer gearbeitet. besteht keine andere möglichkeit? könnte das ganze auch über 2 button realisieren(configure, refresh). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
speedi Geschrieben 29. Mai 2012 Teilen Geschrieben 29. Mai 2012 (bearbeitet) leider habe ich noch nicht mit listener und observer gearbeitet. besteht keine andere möglichkeit? könnte das ganze auch über 2 button realisieren(configure, refresh). Das ist eigentlich nicht so schwer. Zum einen startest du einen Thread (z.B. class MyFileObserver) der in regelmäßigen abständen schaut ob sich der Timestamp der Datei geändert hat. In dieser Klasse, welche die Datei überwacht gibt es dann eine Liste mit ChangeListenern (entsprechende addChangeListener und removeChangeListener- Methoden müsstest du dann natürlich auch implementieren. Wenn sich dann der Timestamp der Datei ändert iterierst du über die Liste und rufst von jedem Changelistener die stateChanged-methode mit einem ChangeEvent dem du als Source das File-Objekt übergibst. Letztendlich kannst das Event dann in etwa so Abfangen: MyFileObserver fileObserver = new MyFileObserver(file); fileObserver.addChangeListener(new ChangeListener(){ @Override public void stateChanged(ChangeEvent event){ // potentiell unsicher durch fehlenden TypeCheck File f = (File)event.getSource(); // Neu laden der Datei load(f); } }); Der FileObserver könnte in etwa so aussehen: import java.io.File; import java.util.LinkedList; import java.util.List; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class FileObserver extends Thread { private File mFile; private boolean mRunning = true; private long mTimeStamp; private List<ChangeListener> mChangeListeners = new LinkedList<>(); public FileObserver(File file) { super(FileObserver.class.getCanonicalName() + ": " + file.getAbsolutePath()); this.mFile = file; this.mTimeStamp = file.lastModified(); start(); } public void addChangeListener(ChangeListener listener) { synchronized (mChangeListeners) { mChangeListeners.add(listener); } } public void removeChangeListener(ChangeListener listener) { synchronized (mChangeListeners) { mChangeListeners.add(listener); } } public void stopObserving() { mRunning = false; interrupt(); } @Override public void run() { while (mRunning) { long timeStamp = mFile.lastModified(); if (timeStamp != this.mTimeStamp) { notifyFileChanged(); mTimeStamp = timeStamp; } try { Thread.sleep(1000); } catch (InterruptedException e) {} } } private void notifyFileChanged() { ChangeEvent changeEvent = new ChangeEvent(mFile); synchronized (mChangeListeners) { for (ChangeListener changeListener : mChangeListeners) { try { changeListener.stateChanged(changeEvent); } catch (Throwable e) { e.printStackTrace(); } } } } } Hinweis: Der Thread im beispiel läuft solang weiter bis du durch aufrufen der Methode stopObserving() den Spaß beendest. Tust du das nicht verschwendest du ressourcen. Du kannst es auch so machen, dass die Schleife unterbrochen wird, sobald sich die Datei geändert hat. Aber so hätte es den Vorteil, dass der Benutzer mit Nodepad++ auch 1000x speichern kann und du lädst immer automatisch neu. Bearbeitet 29. Mai 2012 von speedi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aliter Geschrieben 29. Mai 2012 Teilen Geschrieben 29. Mai 2012 Das Beobachter-Pattern: Galileo Computing :: Java ist auch eine Insel – 7.2 Design-Pattern (Entwurfsmuster) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.