# Wie fang ich ein Projekt an?



## Wodan (19. Mrz 2008)

Hallo,

wie schon dem Titel zu entnehmen ist, ist die große Frage "Womit beginn ich ein Projekt?"

Ich hab angefangen Java zu lernen was sich aber zwecks Zeitgründen immer wieder in die Länge gezogen hat und da ich nun Ferien hab möchte ich mich an ein Projekt setzen was ich mir noch aussuchen werde.

Da man am besten lernt (_wie man programmiert_) wenn man programmiert hab ich erstmal angefangen ein paar Ideen zu sammeln was ich denn überhaupt programmieren könnte.

Ideen:

Programm, dass die Fotos der Digital-Kamera von "DSCF00012.jpg" in "Datum-Aktion-Bildnummer.jpg" umbenennt.
Notenrechner/speicher
Quiz, mit eigenen Fragen für das Allgemeinwissen!
Diese Programme habe ich mir als erste Projekte vorgenommen. 

>>Nur wie fange ich da nun an?? ???:L <<

Hab hierzu kein Kapitel in "Java ist auch eine Insel" gefunden. Eine Art "Womit fängt man an..
Hab dann erstmal gegoogelt und bei Wikipedia gesucht. Was ich gefunden hab ist...
...eine ziemlich aufwendige Planung die mir für kommerzielle Projekte sinnvoll erscheint aber für ein Anfängerprojekt was ein erfahrener Java-Programmierer in 10min. schafft doch zu aufwendig ist.

Welches Programm ist von den oben genannten am leichtesten zu realisieren? (ich tippe mal auf das Programm welches mir meine Bilder umbenennen soll)

Ihr würdet mir sehr weiterhelfen wenn ihr mir sagt wie man so ein Projekt angeht oder ob das die falsche Richtung ist Java zu lernen.

Mit freundlichen Grüßen
Passi


----------



## Beni (19. Mrz 2008)

Ich würde dir ja das Quiz empfehlen, es benötigt wohl kein tieferes Verständnis der API, man kann es beliebig kompliziert/einfach gestalten, später noch zusätzliche Features einbauen, und Probleme mit "was wollte ich eigentlich schreiben?" hast du auch nicht :wink:

Wie du anfangen sollst?
- Blatt Papier nehmen, alles aufschreiben was dir wichtig erscheint (z.B. wer gib wann was ein, was macht das Programm mit der Eingabe).
- Teilprobleme finden (Was ist überhaupt ein Frage? Wie kann ich dem Benutzer was sagen, oder wie kann er was eingeben?).
- PC starten, Teilprobleme einprogrammieren und hoffen, dass du die Teillösungen zu einem grossen Ganzen zusammensetzen kannst.


----------



## Wodan (19. Mrz 2008)

Ok, ich fang mal mit dem Quiz an. Sobald ich mal alles aufgeschrieben hab meld ich mich wieder 
edit: Ich nehm doch das Programm welches mir meine Bilder umbenennen soll. Erscheint mir viel einfacher weil das Quiz hat jetzt schon ein sehr großes ausmaß angenommen..


----------



## Wodan (19. Mrz 2008)

Wie du sagtest hab ich mir nun ein Blatt zur Hand genommen und mal alles aufgeschrieben.

*Ich stell mir das so vor:*
-Programm starten
-Ordner setzen z.b. c:\Dokumente und Einstellungen\user\Desktop\Bilder\Ausflug [Enter] (überprüfen ob es diesen Pfad überhaupt gibt)
-Eingabe des Datums (Jahr.Monat.Tag) z.b. 2008.03.19 [Enter](speichern des Datums)
-Eingabe eines Wortes zur Beschreibung z.b. Ausflug [Enter](speichern der Beschreibung)
-Beginn der Umbenennung zu "2008.03.19_Ausflug1"[Enter](aufrufen der Methode)
-Sobald das Programm fertig ist soll es den Ordner (c:\Dokumente und Einstellungen\user\Desktop\Bilder\Ausflug) öffnen und dann terminieren.

*Probleme:*
-Ordner setzen
-Wie verwirkliche ich eine Eingabe in Java
-Wie erkennt das Programm welche Dateien in dem Ordner der angegeben ist liegen und wie kann der die fixieren und umbenennen???

*Features:*
-grafische Oberfläche
-eine Prozentanzeige die angibt wieviel schon bearbeitet wurde
-Beim Ordner setzen die Möglichkeit aufzeigen den Pfad zu suchen. Es soll sich dann der Explorer öffnen indem man dann den Ordner suchen kann und dann soll das Programm den Ordner nehmen der im Explorer fixiert wurde
-Das Programm soll nicht einfach die Bildnummern mit i++ hochzählen sondern mit Nullen auffüllen sobald es mehr als 10,100,1000,10000 Bilder sind.

so mit i++:
2008.03.19_Ausflug1
2008.03.19_Ausflug2
2008.03.19_Ausflug3
...
2008.03.19_Ausflug15
2008.03.19_Ausflug150

so mit Nullen
2008.03.19_Ausflug001
2008.03.19_Ausflug002
2008.03.19_Ausflug003
...
2008.03.19_Ausflug015
2008.03.19_Ausflug150

War das so wie du es meintest?
D.h. nun müsste ich damit anfang es zu programmieren?

mfg passi


----------



## Beni (19. Mrz 2008)

Ja, genau sowas meinte ich. Ich persönlich würde jetzt mal mit der Eingabe beginnen, aber du kannst dir natürlich auch ein anderes Problem vornehmen.

Da du mit Dateien arbeiten willst, empfehle ich dir noch einen Blick in die API, dort nach der Klasse "java.io.File" suchen :wink:


----------



## Wodan (19. Mrz 2008)

Danke für den Tipp  ich werde mich mal in den zwei Wochen Osterferien hiermit vergnügen *g* vll. wird's ja was


----------



## Faruun (20. Mrz 2008)

Hui ... schicker Plan, sehr vorbildlich.  :applaus: 

Wenn ich noch ein Tipp geben darf, der mir immer sehr hilft:

Versuch die Probleme, die sich auftun werden, gleich technisch zu beschreiben. Ich persönlich könnte mir jetzt unter "Wie erkennt das Programm welche Dateien in dem Ordner der angegeben ist liegen und wie kann der die fixieren und umbenennen??? " nicht so viel vorstellen bzw. habe mich zu Beginn sehr schwer getan, diese Worte in Code umzusetzen.

Formulier das Problem eher in Teilaufgaben (je kleiner, desto einfacher):
- Ordner auswählen
- Dateien in Ordner zählen
- Dateien ggf. nach bestimmten Inhalten filtern (falls nicht nur Bilder im Ordner liegen)
- Dateien umbenennen

Grundsätzlich gilt: Je mehr Du Deinem Programm das Sprechen beibringst, desto schneller findest Du Probleme. (ich spare zu Beginn nicht an System.out.println()). Wenn der Code erstmal funktioniert, kann man das immer noch rausnehmen, bzw. ein schönes Logging einführen.

Viel Spaß mit Deiner Aufgabe.

Gruß,
Faruun


----------



## Wodan (20. Mrz 2008)

Danke, super Idee  
Boah wär ich doch nich so ein Anfänger in Java dann hätt ich vll. schon den ein oder anderen Ansatz aber das wird noch ne weile dauern*g*


----------



## Wodan (20. Mrz 2008)

```
import javax.swing.*;
public class Eingabe {

	public static void main(String[] args) {
		String datum = JOptionPane.showInputDialog( "Eingabe des Datums(Jahr.Monat.Tag)" ); 
		System.out.println( "Datum ist : " + datum );
		String beschreibung = JOptionPane.showInputDialog( "Eingabe eines Wortes zur Beschreibung: " );
		System.out.println("Das Wort lautet: " + beschreibung);
		
	}
}
```

Soooo, die erste Hürde sei geschafft. Gibts hierfür bessere Lösungen? Ich hab noch etwas mit BufferedReader gefunden aber das versteh ich nicht so...
edit:Ich starte da voll durch  in der API find ich unter java.io.file fast alle methoden die ich brauch 
edit2: ich hab nun alles was ich brauch aber von überall bissle zusammengemurkst  ich werds mal zu nem ganzen zusammenbaun und mal schaun obs funktioniert wie ich mir das denk *g*


----------



## Wodan (20. Mrz 2008)

```
import java.io.*;
import javax.swing.*;

public class Rename {
	public static void main(String[] args){

		/*Hier werden Ort der Bilder,Datum & Beschreibung der Tätigkeit gesetzt */
		/*Pfad des Bildes*/
		String pfad = JOptionPane.showInputDialog( "Eingabe des Pfades der Bilder wie z.B. C:/Dokumente und Einstellungen/user/Desktop/Bilder" );
		System.out.println("Der Pfad lautet: " + pfad);
		
		/*Datum der Aktion*/
		String datum = JOptionPane.showInputDialog( "Eingabe des Datums(Jahr.Monat.Tag) wie z.b. 2008.03.19" ); 
		System.out.println( "Datum ist : " + datum );
		
		/*Beschreibung der Aktion in ein Wort*/
		String beschreibung = JOptionPane.showInputDialog( "Eingabe eines Wortes zur Beschreibung wie z.B. 'Ausflug' " );
		System.out.println("Das Wort lautet: " + beschreibung);

		/*Hier wird nun der Pfad ausgelesen und in ein Array gespeichert*/
		File f = new File(pfad);
		File[] fileArray = f.listFiles();
		for (int i = 0; i<fileArray.length;i++) {
			System.out.println(fileArray[i]);
		}

		/*Nun wird die Datei umbenannt in Datum_Beschreibung_Bildnummer*/
		for (int k = 0; k<fileArray.length;k++){
			fileArray[k].renameTo(new File(pfad + "/" + datum +"_" + beschreibung + "" + k +".jpg"));
		}
	}
}
```

Das hab ich bis jetzt zusammengemurkst und es funktioniert auch aber ich bekomme eine Fehlermeldung die aber wohl nicht viel zu sagen hat weil es ja trotzdem funktioniert oder etwa doch?
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820]

Bevor ich weiter mach wart ich ma ab was so an verbesserung kommt.
thx


----------



## Noar (20. Mrz 2008)

Hi,

hatte das auch mal, ist wohl ein Bug. Siehe auch hier: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6476706

Ein möglicher workaround ist wohl ein 

```
System.exit(0);
```
am Ende.


----------



## Wodan (20. Mrz 2008)

Ist das erforderlich am Schluss? Es beendet doch auch so oder?
edit: habs mal hinzugefügt und nun kommt keine Fehlermeldung mehr


----------



## Beni (20. Mrz 2008)

Um den Pfad abzufragen...

```
String pfad = JOptionPane.showInputDialog( ... );
```
... ist auch immer ein JFileChooser  schön :wink:


----------



## Wodan (20. Mrz 2008)

Cool  Das meinte ich mit "art explorer in dem man dn ordner suchen kann" werd mir das mal anschaun und einbaun
edit: ok ich hab gemerkt das das bissle schwerer ist aber auch das es da nen haufen material im netz gibt. Ich werd mal mein Programm eins nach dem andern verbessern und ab und zu ma neuen code posten um nachzufragen ob ich da auf'm holzweg bin oder was aufjedenfall programmiertechnisch zu verbessern ist.


----------



## Wodan (21. Mrz 2008)

```
import java.io.*;
import javax.swing.*;

public class Rename {
	public static void main(String[] args){

		//Hier werden Ort der Bilder,Datum & Beschreibung der Tätigkeit gesetzt

		//Pfad der Bilder
		//Erzeugt eine Instanz von JFileChooser
		JFileChooser chooser = new JFileChooser();

		//Ruft die Methode auf um der Instanz zu sagen das nur Ordner auswählbar sind
		chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

		//Öffnet den JFileChooser
		chooser.showOpenDialog(null);

		//Holt sich den Pfad der gewählt wurde
		File f = chooser.getSelectedFile();

		//Holt sich die Dateien die in diesem Pfad liegen
		File[] fileArray = f.listFiles();

		//Datum der Aktion
		String datum = JOptionPane.showInputDialog( "Eingabe des Datums(Jahr.Monat.Tag) wie z.b. 2008.03.19" ); 

		//Beschreibung der Aktion in einem Wort
		String beschreibung = JOptionPane.showInputDialog( "Eingabe eines Wortes zur Beschreibung wie z.B. 'Ausflug' " );

		//Nun wird die Datei umbenannt in Datum_Beschreibung_Bildnummer
		//Hier wird getestet ob ein Datum eingetippt wurde
		boolean result = datum.equals("");
		if (result){
			for (int i = 0; i<fileArray.length;i++){
				fileArray[i].renameTo(new File(f, beschreibung + "" + i +".jpg"));
			}
		}
		else {
			for (int i = 0; i<fileArray.length;i++){
				fileArray[i].renameTo(new File(f, datum +"_" + beschreibung + "" + i +".jpg"));
			}
		}

		//Beendet das Programm
		System.exit(0);
	}
}
```

Wollte mal posten was ich bis jetzt schon verbessert habe.  Gibts hierzu KOmmentare was gut/schlecht noch zu verbessern ist??


----------



## Illuvatar (21. Mrz 2008)

Ich liste hier jetzt mal nur auf, was mir _negativ_ auffällt. Das sind aber alles nur mehr/weniger Kleinigkeiten 

*Inhaltlich:*
Die Datumseingabe könnte vielleicht noch besser gemacht werden (z.B. so etwas wie JCalendar oder einfach nur eine Überprüfung ob das eingegebene Datum "Sinn macht" (siehe hier)) - das wird dann aber schnell relativ schwierig.
Generell solltest du darauf achten, was passiert, wenn der Benutzer so einen Eingabedialog abbricht. 
	
	
	
	





```
chooser.showOpenDialog(null);
```
 hat einen Rückgabewert, bei dem du überprüfen solltest, ob er gleich JFileChooser.APPROVE_OPTION ist. Auch die JOptionPane-Methoden können null zurückgeben, z.B. wenn der User auf das "x" oben rechts klickt. In solchen Fällen solltest du die Programmausführung eben beenden.

*Programmierstiltechnisch:*
Den Variablennamen find ich etwas nichtssagend: 
	
	
	
	





```
boolean result = datum.equals("");
```
 Vielleicht wär hier eh ein 
	
	
	
	





```
if (datum.equals(""))
```
 angebrachter. (Vorher überprüfen ob datum null ist! s.o.)

Ich vermisse ein wenig die OOP :bae: Ich weiß ja nicht, wie weit du da bisher vorgedrungen bist. Das ist ja auch ein recht kurzes Programm, da lohnt sich OOP kaum. Aber zum Üben könnte man da ja mal ein paar mehr Klassen und Methoden mehr draus machen. Für den Anfang (sobald man OOP kann) empfiehlt sich die Richtlinie: Je weniger Code innerhalb von "static"-Bereichen steht, desto besser.


----------



## Wodan (22. Mrz 2008)

Danke 
So hab ich mir das gedacht *g* schritt für schritt das Programm verbessern und mich in Java so einarbeiten. Kann ich nur jedem weiterempfehlen.


----------



## Wodan (22. Mrz 2008)

```
import java.io.*;
import javax.swing.*;

public class Rename {
	public static void main(String[] args){

		//Hier werden Ort der Bilder,Datum & Beschreibung der Tätigkeit gesetzt

		//Pfad der Bilder
		//Erzeugt eine Instanz von JFileChooser
		JFileChooser chooser = new JFileChooser();

		//Ruft die Methode auf um der Instanz zu sagen das nur Ordner auswählbar sind
		chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

		//Öffnet den JFileChooser
		int returnVal = chooser.showOpenDialog(null);
		if(returnVal == JFileChooser.APPROVE_OPTION){

			//Holt sich den Pfad der gewählt wurde
			File f = chooser.getSelectedFile();

			//Holt sich die Dateien die in diesem Pfad liegen
			File[] fileArray = f.listFiles();

			//Datum der Aktion
			String datum = JOptionPane.showInputDialog( "Eingabe des Datums(Jahr.Monat.Tag) wie z.b. 2008.03.19" ); 

			//Beschreibung der Aktion in einem Wort
			String beschreibung = JOptionPane.showInputDialog( "Eingabe eines Wortes zur Beschreibung wie z.B. 'Ausflug' " );

			//Nun wird die Datei umbenannt in Datum_Beschreibung_Bildnummer
			//Hier wird getestet ob ein Datum eingetippt wurde
			if (datum.equals("")){
				for (int i = 0; i<fileArray.length;i++){
					fileArray[i].renameTo(new File(f, beschreibung + "" + i +".jpg"));
				}
			}
			else {
				for (int i = 0; i<fileArray.length;i++){
					fileArray[i].renameTo(new File(f, datum +"_" + beschreibung + "" + i +".jpg"));
				}
			}
		}
		//Beendet das Programm
		System.exit(0);
	}
}
```

Hab das mal eingebaut aber noch ne frage dazu

```
int returnVal = chooser.showOpenDialog(null);
		if(returnVal == JFileChooser.APPROVE_OPTION)
```
Diese Konstante ist ja "0". also muss ja returnVal auch "0" sein damit es weitergeht. chooser.showOpenDialog(null); ist also normalerweise "0" und wenn ich abbrech wird's 1 oder wie??


----------



## SebiB90 (22. Mrz 2008)

Wodan hat gesagt.:
			
		

> Hab das mal eingebaut aber noch ne frage dazu
> 
> ```
> int returnVal = chooser.showOpenDialog(null);
> ...


ja, wenn "normal" eine Datei ausgesucht wurde und auf öffnen geklickt wurde, hat returnVal den Wert JFileChooser.APPROVE_OPTION. Welcher Integer Wert das nun genau ist, weiß ich net, mehr oder weniger auch unwichtig, du kannst ja mit den Konstanten arbeiten, ist auch sinnvoller denn == 0 sagt dir nix, == JFileChooser.APPROVE_OPTION hingegen schon 
Wenn abgebrochen wird (und eigentlich auch, wenns einfach geschlossen wird), hat returnVal den Wert JFileChooser.CANCEL_OPTION. Gut möglich das diese Konstante den Wert 1 hat, jedoch wie gesagt, eher unwichtig.
Wenn du es wissen willst, einfach mal ausgeben lassen.


----------



## Wodan (22. Mrz 2008)

Ja in Eclipse sieht man den Wert der Konstante ja aber yeah ich habs kappiert danke


----------



## Ocean-Driver (13. Apr 2008)

Wenn ich mich nicht irre könntest du folgendes:


```
int returnVal = chooser.showOpenDialog(null); 
      if(returnVal == JFileChooser.APPROVE_OPTION)
```


auch so schreiben:


```
if(chooser.showOpenDialog(null) = JFileChooser.APPROVE_OPTION)
```


Wenn man die Variable eh nur einmal braucht..


----------



## Gast (12. Aug 2008)

Es muss

if(chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
                                               ^^

heißen.


----------



## JohnnyNitro (19. Nov 2008)

...erstmal viel Erfolg bei deinem Projekt.  :toll: .....und nicht verzweifeln, wenn mal was nicht gleich am Anfang hinhaut...das wird dir beim programmieren noch öfters passieren  :wink: .


hab noch einen Verbesserungsvorschlag für dich:

Da du ja jetzt einen FileChooser eingebaut hast, wäre es doch sicher ganz nett, wenn dein FileChooser nur bestimmte Dateien, also z.B. nur .txt Dateien, anzeigen würde. Du kennst sowas ja sicher von anderen Windowsprogrammen. Man kann dann wählen, dass nur Dateien eines bestimmten Dateiformats angezeigt werden, oder eben alle Dateien. 

Falls du keine Idee hast, wie man sowas realisieren kann, dann hier noch ein Stichwort: FileFilter. Findet sich natürlich in der API  :wink: .


----------

