2013-08-24

Ultimate Swing, Teil 29

Ich habe in letzter Zeit ein paar Verbesserungen an Notes and Tasks und der Schuhschachtel (Sie erinnern sich vielleicht: ich fasse potenziell wiederverwendbare Teile zu diesem Mini-Framework"chen" zusammen) vorgenommen. Neu ist beispielsweise das Interface IController. Es enthält die Methoden setup(), getModel() und getView(). Die beiden letztgenannten sind praktisch, weil übergeordnete Controller nicht für jedes Modell und jede Sicht untergeordneter Controller eigene Referenzen halten müssen. Die Klasse MainController von Notes and Tasks nutzt dies. Sie ist übrigens kein IController, da sie ja schon das Interface ApplicationCallback implementiert und damit den Lebenszyklus der Anwendung steuert. Natürlich ist auch das eine Art Controller. Die Methode setup() von IController-Implementierungen wird auf dem EDT aufgerufen. Hier können Bedienelemente mit Werten aus dem Modell befüllt oder Einstellungen aus den Preferences übernommen werden.

Eine weitere Ergänzung betrifft Drag and Drop. Wenn Sie eine Textdatei auf das Hauptfenster von Notes and Tasks schieben, wird diese zeilenweise eingelesen und jede Zeile erscheint als neue Aufgabe. Hierzu habe ich das Interface ApplicationCallback um die Methode fileDropped() erweitert. Für jede fallen gelassene Datei wird sie einmal aufgerufen. Die Implementierung der Drag and Drop-Funktionalität ist sehr einfach: In der Schuhschachtel-Klasse Application gibt es die Methode configureFrame(). Sie wird um wenige Zeilen Code erweitert.

 // drag and drop support  
 setTransferHandler(new TransferHandler() {  
     
   @Override  
   public boolean canImport(TransferHandler.TransferSupport support) {  
      // support.setDropAction(COPY); ??  
      return support.isDataFlavorSupported(DataFlavor.javaFileListFlavor);  
   }  
   
   @Override  
   public boolean importData(TransferHandler.TransferSupport support) {  
      boolean success = false;  
      if (canImport(support)) {  
        final Transferable t = support.getTransferable();  
        try {  
           final List<File> l =  
                (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);  
           for (File f : l) {  
              INSTANCE.callback.fileDropped(f);  
           }  
           success = true;  
        } catch (UnsupportedFlavorException e) {  
           LOGGER.throwing(getClass().getName(), "importData", e);  
        } catch (IOException e) {  
           LOGGER.throwing(getClass().getName(), "importData", e);  
        }  
      }  
      return success;  
   }  
 });  
   

Letztlich wird nur ein Objekt des Typs TransferHandler erzeugt und der Methode setTransferHandler() des Anwendungshauptfensters übergeben.

Die Implementierung der Leseroutine in Notes and Tasks (im MainController) ist schon fertig. Bauen Sie doch einmal eine Testdatei und ziehen diese auf das Hauptfenster. Einige Aufgaben werden angelegt, aber nicht alle. Sind Sie tief genug mit dem Quelltext vertraut, um herauszufinden, was da schief geht? Das Problem liegt in einer Methode, die in fileDropped() aufgerufen wird.

No comments:

Post a Comment