| « Tutorial: CSVCheck (2) | Tutorial: Verbindungen mit TouchGraph GraphLayout visualisieren » |
Tutorial: CSVCheck (1)
Diese Anforderung aus dem Alltag eignet sich bestens, um mal ein paar Schritte in der Anwendungsentwicklung durchzugehen: CVS-Dateien analysieren, aufbereiten und als formatierte Excel-Datei sichern.
Das kann man natürlich alles von Hand in Excel machen, klar. Wenn der Analyseteil aber sehr aufwendig (und nervtötend) ist und die Daten immer gleichartig strukturiert sind, lohnt sich die Automatisierung.
Ideal wäre eine kleine Anwendung, an die man eine Datei per Drag&Drop übergibt und kurz darauf einen Speichern-Dialog für das Resultat anbietet. Mal sehen, wie weit wir kommen...
Fortsetzung:
Die Benutzeroberfläche könnte zum Beispiel so aussehen:

Nach dem Drop einer Datei auf das große weiße Feld soll die Analyse sofort starten und der Fortschritt in einem animierten Balken angezeigt werden.
Mit Netbeans ist so ein Fensterchen schnell gebaut, und ich möchte hier nicht mit dem ganzen automatisch erzeugten Code langweilen. Ein kleiner Auszug mit Variablendeklarationen reicht, um die verwendeten Elemente zu dokumentieren:
Code:
private javax.swing.JButton btnExit; | |
private javax.swing.JLabel jLabel1; | |
private javax.swing.JLabel jLabel2; | |
private javax.swing.JLabel jLabel3; | |
private javax.swing.JScrollPane jScrollPane1; | |
private javax.swing.JProgressBar pbar; | |
private javax.swing.JTextArea txtFile; |
Der Button "btnExit" beendet das Programm, "txtFile" ist das Textfeld im ScrollPane, das auf Drag&Drop reagiert und "pbar" ist unsere Fortschrittsanzeige.
Schritt 1: Drag&Drop ermöglichen
Das Ziel: Beim Drop prüft das Programm, ob es sich um eine einzelne CSV-Datei handelt. Wenn ja, schreibt es den Dateipfad ins Textfeld und startet den Analyseprozess. Das ist verblüffend einfach zu machen. Ich habe die Klasse des Programmfensters (ein JFrame) "Hauptfenster" genannt. Nun ergänze ich die Zeile, wo die Klasse beginnt, um eine Interface-Angabe:
Code:
public class Hauptfenster extends JFrame implements DropTargetListener { |
Das Interface DropTargetListener erzwingt fünf Methoden in der Klasse: dragEnter, dragOver, dropActionChanged, dragExit und drop. Netbeans unterstützt die Methodenerstellung mit dem Befehl "Implement all abstract methods".
Und schon sind alle da:
Code:
public void drop (DropTargetDropEvent dtde) { | |
} | |
| |
public void dragEnter (DropTargetDragEvent dtde) { | |
} | |
| |
public void dragOver (DropTargetDragEvent dtde) { | |
} | |
| |
public void dropActionChanged (DropTargetDragEvent dtde) { | |
} | |
| |
public void dragExit (DropTargetEvent dte) { | |
} |
Im Moment brauchen wir nur die Methode drop, alle anderen können erstmal ohne Inhalt stehen bleiben.
Ich möchte, dass nur einzelne CSV-Dateien auf das Feld gezogen werden können. Verschiedene Fälle sollen mit entsprechenden Meldungen kommentiert werden, die direkt in der ProgressBar erscheinen sollen.
So sieht also die drop-Methode aus:
Code:
public void drop (DropTargetDropEvent dtde) { | |
try { | |
Transferable tr = dtde.getTransferable (); | |
DataFlavor[] flavors = tr.getTransferDataFlavors (); | |
| |
if (flavors[0].isFlavorJavaFileListType ()) { | |
// Akzeptiere gedroppte Datei | |
dtde.acceptDrop (dtde.getDropAction ()); | |
| |
java.util.List files = (java.util.List) tr.getTransferData (flavors[0]); | |
dtde.dropComplete (true); | |
if(files.size ()[gt]1) { | |
pbar.setString ("Bitte nur eine Datei!"); | |
} else { | |
txtFile.setText (""); | |
// Schreibe den Pfad in die JTextArea | |
final String path=files.get (0).toString (); | |
txtFile.setText (path); | |
if(path.endsWith (".csv") || path.endsWith (".txt")) { | |
pbar.setString ("Datei wird bearbeitet..."); | |
// Datenanalyse starten | |
Analyse a=new Analyse (path,this); | |
} else { | |
pbar.setString ("Bitte CSV- oder TXT-Datei verwenden!"); | |
} | |
} | |
return; | |
} | |
} catch (Exception ex) { | |
ex.printStackTrace (); | |
txtFile.setText (ex.toString ()); | |
} | |
// Wenn ein Fehler aufgetreten ist | |
dtde.rejectDrop (); | |
} |
Zeile 4 ermittelt den Typ des gezogenen Objekts, Zeile 6 prüft, ob wir es mit einer Datei zu tun haben. Damit kann es schon mal grundsätzlich weitergehen.
Zeile 12 prüft, ob es sich um eine und nicht mehrere Dateien handelt. Der Pfad dieser Datei erscheint anschließend im Textfeld. Die Verarbeitung startet aber nur bei CSV- und TXT-Dateien, wie Zeile 19 zeigt. Ich habe die komplette Verarbeitung einschließlich Datensicherung in eine andere Klasse ausgelagert, um die Klasse des Programmfensters möglichst schlank zu halten und um im Sinn einer Separation of Concerns vorzugehen. Meine JFrame-Klasse soll nur die Benutzeroberfläche aufbauen und keine spezielle Programmlogik enthalten.
Die folgt in der Klasse Analyse, wo es allmählich spannend wird...
Seiten: 1 · 2
Noch kein Feedback
Kommentare sind für diesen Eintrag deaktiviert.