# Bitte Testen: Mein Multi-File Editor



## michi2 (27. Mai 2006)

Hallo,
Ich hab hier schon mal meinen Editor vorgestellt.
Nun habe ich eine "Multifile"-Version, soll heißen er kann mehrere Dateien gleichzeitig öffnen, programmiert.
Trotz dem das ich befürchte das ihr den Lösungsweg als "unproffessionel" bezeichnen werdet, will ich von euch wissen was ihr davon haltet.
Denn schließlich funktioniert meine Methode und schnell ist sie auch noch!
Ihr findet Code + fertig compiliertes Programm unter people.freenet.de/m.schoenitzer/MultiFile.zip!
Die interessanten Codestücke sind:
 * am Ende der Datei Michis_Editor.java (Klasse cfile)
 * in der Datei MultiFile.java
 * und vielleicht noch in GrundfunkActionLauscher.java

Ich würde mich auf Antworten freuen.
Danke,
Michi


PS: Benutze jetzt extra Konqueror um euch einigermaßen vor Rechtschreibfehler zu schützen


----------



## michi2 (22. Jun 2006)

Könnte ich wenigstens wissen warum ihr das gar nicht testet?


----------



## Roar (22. Jun 2006)

mach doch halt mal ne jar draus, ich persönlich hab jedenfalls keine lust das programm extra irgendwo abzuspeichern und dann über die konsole zu starten :/


----------



## michi2 (22. Jun 2006)

Würd ich gern schaffe es aber nicht, bin genau der beschreibung in der FAQ gegangen, aber die Jar-Datei startet nicht. Hab das hir schon mal in nem extra Threat gefragt, aber da hat mir auch nimand geantwortet.
Zum starten liegt ein script bei: damit kannst du es unter Linux direct starten; unter Win musst dem script erst ein .bat verpassen, schon läufts.


Die zentralen Code-Teile sind:
1.) Hier werden alle einstellungen zu den geöfneten Dokumenten gespeichert:

```
class cfile
   {
      String suchen;
      public int suchindex = -1;
      
      // globale Variablen innerhalb der Klasse
      public File einausgabedatei;           			// zu ladende/speichernde Datei
      public String m_dateiname_Name = "";          		// reiner Name
      public String m_dateiname_Path = "";           		// reiner Pfad
      boolean m_dateiname_gueltig = false;
      public boolean search_up = false;
      public boolean bgenau = false;
      public boolean bcursor = false;
      //JMenuItem item3_2;
      public String m_aktText;      			// aktueller Text in der TextArea
      String m_alterText;      				// alter Text der TextArea
      String[] m_alterTextNr = new String[10];      		// alter Text der TextArea
      LinkedList m_undoTextNr = new LinkedList();		// Undo Text der TextArea
      LinkedList last_used = new LinkedList();		//Lastused
      JMenuItem[] item1_6_ = new JMenuItem[4];		//Die Lastused eintr�ge
      int[] markerNr = new int[127];			// Die Markerwerte
      JMenuItem[] item2_11b_ = new JMenuItem[127];	//Die 'gehe zu Marker' eintr�ge
      public JMenuItem[] item2_11c_ = new JMenuItem[127];	//Die 'L�se Marker' eintr�ge
      byte m_undoNumber = 0;			//Aktuelle undo-Position
      byte markerNumber = 0;			//Anzahl der Marker
      boolean gespeichert = false;
      public pk.CTextAnzeige m_textanzeige;   	// die eigentliche TextArea
      public JTextArea TA;
      JPanel p_neu;
      JComboBox m_fonts,m_styles;    	 	// Auswahl von Fonttyp, Stil und
      JComboBox m_farben;             			// Farbe
      JComboBox m_groese;			//Groese
      JScrollPane scroll;

      int cursorposition;
   
   
   void laden()
      {
      Michis_Editor.suchen = suchen;
      Michis_Editor.suchindex = suchindex;
      Michis_Editor.einausgabedatei = einausgabedatei;
      Michis_Editor.m_dateiname_Name = m_dateiname_Name;
      Michis_Editor.m_dateiname_Path = m_dateiname_Path;
      Michis_Editor.m_dateiname_gueltig = m_dateiname_gueltig;
      Michis_Editor.search_up = search_up;
      Michis_Editor.bgenau = bgenau;
      Michis_Editor.bcursor = bcursor;
      Michis_Editor.m_aktText = m_aktText;
      Michis_Editor.m_undoTextNr = m_undoTextNr;
      Michis_Editor.last_used = last_used;
      Michis_Editor.item1_6_ = item1_6_;
      Michis_Editor.item2_11c_ = item2_11c_;
      Michis_Editor.m_undoNumber = m_undoNumber;
      Michis_Editor.markerNumber = markerNumber;
      Michis_Editor.gespeichert = gespeichert;
      Michis_Editor.TA = TA;
      Michis_Editor.p_neu = p_neu;
      Michis_Editor.m_fonts = m_fonts;
      Michis_Editor.m_styles = m_styles;
      Michis_Editor.m_farben = m_farben;
      Michis_Editor.m_groese = m_groese;
      Michis_Editor.scroll = scroll;
      Michis_Editor.m_textanzeige = m_textanzeige;
      Michis_Editor.m_textanzeige.setText(m_aktText);
      Michis_Editor.m_textanzeige.setCaretPosition(cursorposition);

      if(!m_dateiname_Name.equals(""))
         Michis_Editor.e1.setTitle("Michi's Editor 3 - " + m_dateiname_Name);
      else
         Michis_Editor.e1.setTitle("Michi's Editor 3");
      }

   void speichern()
      {
      suchen =	 Michis_Editor.suchen;
      suchindex =	 Michis_Editor.suchindex;
      einausgabedatei =	 Michis_Editor.einausgabedatei;
      m_dateiname_Name =	 Michis_Editor.m_dateiname_Name;
      m_dateiname_Path =	 Michis_Editor.m_dateiname_Path;
      m_dateiname_gueltig =	 Michis_Editor.m_dateiname_gueltig;
      search_up =	 Michis_Editor.search_up;
      bgenau =	 Michis_Editor.bgenau;
      bcursor =	 Michis_Editor.bcursor;
      m_aktText =	 Michis_Editor.m_aktText;
      m_undoTextNr =	 Michis_Editor.m_undoTextNr;
      last_used =	 Michis_Editor.last_used;
      item1_6_ =	 Michis_Editor.item1_6_;
      item2_11c_ =	 Michis_Editor.item2_11c_;
      m_undoNumber =	 Michis_Editor.m_undoNumber;
      markerNumber =	 Michis_Editor.markerNumber;
      gespeichert =	 Michis_Editor.gespeichert;
      TA =	 Michis_Editor.TA;
      p_neu =	 Michis_Editor.p_neu;
      m_fonts =	 Michis_Editor.m_fonts;
      m_styles =	 Michis_Editor.m_styles;
      m_farben =	 Michis_Editor.m_farben;
      m_groese =	 Michis_Editor.m_groese;
      scroll =	 Michis_Editor.scroll;
      m_aktText = Michis_Editor.m_textanzeige.getText();
     m_textanzeige =	 Michis_Editor.m_textanzeige;
     cursorposition = m_textanzeige.getCaretPosition();
      }
   void println()
   {
     System.out.println("cfile, TAtext: " + m_textanzeige.getText());
     System.out.println("cfile, text: " + m_aktText);
   }
 }
```
2.)Für eine neue Datei wird dann folgendes benützt:

```
public static void newfile()
      {
      m_textanzeige.setText("");
      offenedateien[dateinummer] = new cfile();
      offenedateien[dateinummer].speichern();
      lastdatnummer = dateinummer;
      offenedatcb.addItem("Neues Dokument " + neuesdoknummer);
      offenedatcb.setSelectedIndex(dateinummer);
      dateinummer++;
      lastdatnummer = dateinummer-1;
      neuesdoknummer++;
      Michis_Editor.e1.setTitle("Michi's Editor");
      }
```
3.)Und zum Öffnen:

```
public static void open()
      {
      offenedateien[dateinummer] = new cfile();
      offenedateien[dateinummer].speichern();
      System.out.println("1");
      lastdatnummer = dateinummer;
      System.out.println("2: "+ dateinummer);
      offenedatcb.addItem(m_dateiname_Name);
      offenedatcb.setSelectedIndex(dateinummer);
      System.out.println("3");
      dateinummer++;
      lastdatnummer = dateinummer;
      }
```


----------



## Beni (22. Jun 2006)

Manchmal wird ein Thread auch einfach übersehen... aber merk dir: wenn du was von anderen haben willst, mach es ihnen so einfach wie möglich. Das mit dem ".bat" hinzufügen ist nicht so dolle :wink: 

Ich habe mich mal auf Fehlersuche gemacht (gniarrharhar, ich liebe es, böse zu sein), und _gnadenlos_ aufgeschrieben was mir nicht gefällt:

Laufzeit:
Wenn man gar nichts eingiebt, und dann bei "Formatieren" rumdrückt, gibt es massenweise Exceptions.
Wenn man "Java > Compile" macht, und dann "Abbrechen" drückt, wird nicht abgebrochen.

Vom Code her:
Rechtschreibefehler in einem Klassennamen... das könntest du besser :wink: "Suchen_Erstezen"

*DU HAST ZUVIELE STATIC VARIABLEN IN DEINEM PROGRAMM* (wollte ich nurmal betonen). In "Michis_Editor" solltest du mal grosszügig sämtliche statics rauslöschen. "static" ist das, was zwischen dir und OOP steht...

Eine einfache, aber gute, Regel ist: jede Methode sollte auf dem Bildschirm Platz haben. Versuch das mal umzusetzen (z.B. im JavaActionLauscher), du wirst wesentlich mehr Freude an deinem Programm haben. Besonders wenn du mal was reparieren musst.

MultiFile funktioniert, soweit sogut. Aber: lösch mal alle statics raus. Und: eine Exception unterschlagen zeugt nicht von gutem Stil "catch(ArrayIndexOutOfBoundsException AIOOBEx){}". Eine Exception bedeutet, dass du einen Fehler einprogrammiert hast. Eine wertvolle Information die es auszuschöpfen gilt, um das Programm zu verbessern.
Wieso du MultiFile von Michis_Editor erben lässt, wurde mir nicht ganz klar?

GrundFunktionLauscher: Die Vererbung ist hier wirklich sehr, sehr fragwürdig. Der Lauscher ist schliesslich kein Editor... Und die actionPerformed-Methode ist ein bisschen lang geworden.


Ich würde dir empfehlen:
- Pro Button oder MenuItem einen ActionListener schreiben
- Auf sämtliche "statics" verzichten (bis auf das "public static main" natürlich :wink
- Vererbung nur für "x ist ein y" einsetzen, und nicht für "x benötigt statische Variablen aus y".
- Referenzen sauber verknüpfen (was dann "static" überflüssig macht).


Schlusswort: Übung macht den Meister. Immerhin kannst du bereits ein Programm schreiben, damit kannst du schon weit mehr als der Durchschnittsbürger. Schreib dir "Michis Editor 2", und lerne aus all den Fehlern und Problemen der ersten Version. Ich bin mir sicher, du hast selbst einiges bemerkt was ich eben angekreidet habe.


----------



## michi2 (22. Jun 2006)

Beni hat gesagt.:
			
		

> Manchmal wird ein Thread auch einfach übersehen... aber merk dir: wenn du was von anderen haben willst, mach es ihnen so einfach wie möglich. Das mit dem ".bat" hinzufügen ist nicht so dolle :wink:


Das macht die Linuxer aber nicht glücklich.



> Wenn man gar nichts eingiebt, und dann bei "Formatieren" rumdrückt, gibt es massenweise Exceptions.
> Wenn man "Java > Compile" macht, und dann "Abbrechen" drückt, wird nicht abgebrochen.


Danke für den hinweis, werd ich verbessern.



> Vom Code her:
> Rechtschreibefehler in einem Klassennamen... das könntest du besser :wink: "Suchen_Erstezen"


Rechtschreibung ist definitiv nicht mein Ding, bin aber auch nachgewissener Legasteniker



> *DU HAST ZUVIELE STATIC VARIABLEN IN DEINEM PROGRAMM* (wollte ich nurmal betonen). In "Michis_Editor" solltest du mal grosszügig sämtliche statics rauslöschen. "static" ist das, was zwischen dir und OOP steht...


Ja, ich weiss werd das machen, haben mir schon mehrere hir im Forum gesagt.



> Eine einfache, aber gute, Regel ist: jede Methode sollte auf dem Bildschirm Platz haben. Versuch das mal umzusetzen (z.B. im JavaActionLauscher), du wirst wesentlich mehr Freude an deinem Programm haben. Besonders wenn du mal was reparieren musst.


was ist wen ich dir sage ich benütze Schriftgröße 4? 



> MultiFile funktioniert, soweit sogut.


Und du "meckerst" nicht über obengeposteden Code??? *aufatem*



> Wieso du MultiFile von Michis_Editor erben lässt, wurde mir nicht ganz klar?
> GrundFunktionLauscher: Die Vererbung ist hier wirklich sehr, sehr fragwürdig. Der Lauscher ist schliesslich kein Editor...
> - Vererbung nur für "x ist ein y" einsetzen, und nicht für "x benötigt statische Variablen aus y".
> 
> - Referenzen sauber verknüpfen (was dann "static" überflüssig macht).


Faulheit! Werds aber ändern!



> Ich würde dir empfehlen:
> - Pro Button oder MenuItem einen ActionListener schreiben


Ist das nicht ein bischen zu drastisch? Schlieslich haben viel "Reacktionen" nur 1-3 Zeilen.



> Schlusswort: Übung macht den Meister. Immerhin kannst du bereits ein Programm schreiben, damit kannst du schon weit mehr als der Durchschnittsbürger. Schreib dir "Michis Editor 2", und lerne aus all den Fehlern und Problemen der ersten Version. Ich bin mir sicher, du hast selbst einiges bemerkt was ich eben angekreidet habe.


Willst du damit sagen ich soll nen neuen Editor programmiern? Falls ja: nein, war zu fiel Arbeit.
Oder meinst du ich soll die nächste Version gründlich überarbeiten?
Dies ist die MultiFile-Version (bessere Nammen?), paraell zu dieser hab ich die nicht Multifile-Version weiterprogrammiert.
Ich wollte hir hauptsächlich wissen ob diese Art wie ich die Multifile-Version umgesetzt habe in ortnung ist?
Wenn ja führe ich beide "Projekte" wider zusammen und mertze alle gennanten Fehler (und mehr) nacheinander aus.
Der Editor ist übrigens schon in der Version 3.5.0.x und ja ich weiß ich war am Anfang zu großzügig mit neuen Versionsnummern.


Weitere Bekannte Fehler/Einschrenkungen:
-Druckfunktion druckt nur 1 Seite
-Variablen-Gucker funktioniert nicht ganz
-Variablen-Gucker zeigt nur Primitive Variablen, Strings und deren Arrays an
-compiele funktion hängt immer wieder (hauptsächlich bei mehr als 100 Fehlern)
-in der akt. Version wird, im gegensatz zu älteren Versionen, der Titel der geladenen Datei nicht mehr im Titel angezeigt...
-beim Exportieren als HTML werden Sonderzeichen nicht in HTLM-Entries umgewandelt

Geplannte Features:
Highligthing
Rechtschreibkorrektur (->Jazzy, auch übersehen oder kennt das selbst *ihr* nicht)

Danke für den sehr informativen Test!


----------



## Beni (22. Jun 2006)

> > Ich würde dir empfehlen:
> > - Pro Button oder MenuItem einen ActionListener schreiben
> 
> 
> Ist das nicht ein bischen zu drastisch? Schlieslich haben viel "Reacktionen" nur 1-3 Zeilen.


Entweder hat man "zuviel" oder "zuwenige" Klassen. "zuviel" ist immer besser als "zuwenig" (wobei ich damit nicht sagen will, dass "zuviel" gut ist...). Derzeit ist bei dir aber noch "zuwenig" :wink:

Ja, für 1-3 Zeilen ist eine ganze Klasse etwas übertrieben. Gut ist, wenn du hier Gemeinsamkeiten suchst, und mehrere Aktionen zusammenfassen kannst (z.B. "speichern" und "speichern als..." sind sehr ähnlich). Aber grundsätzlich ist halt jedes dieser "if's" in dem ActionListener eine potentielle Fehlerquelle, und je weniger du davon hast, desto besser. Bedenk auch, dass es mit einer IDE sehr einfach ist, eine neue Klasse zu schreiben - sehr viel zusätzlichen Aufwand gibt das alles nicht.




> Willst du damit sagen ich soll nen neuen Editor programmiern? Falls ja: nein, war zu fiel Arbeit.


Jop, genau das meine ich :bae: 
Als meine Java-Karriere begann, wollte ich ein Programm schreiben, das etwas ungeheur komplexes kann. Das Ergebnis war natürlich ernüchternd...
Also schrieb ich das Programm nocheinmal, und nocheinmal. Und bei jedem dieser Sprünge wurde das Programm wesentlich besser, da ich vom vorherigen Versuch wusste, was diesmal anders sein soll.
Die jeweils nächsten Versionen benötigten nicht mehr Zeit. Denn wenn man etwas zum zweiten mal schreibt, geht es wesentlich leichter. Bei alldem ist nur wichtig: es wird _nichts_ vom alten Code kopiert.

Tjo, und ich denke dir würde es genau gleich gehen. Gigantische Fortschritte bei vergleichsweise moderatem Aufwand.



> Oder meinst du ich soll die nächste Version gründlich überarbeiten?


Das wäre auch möglich, aber die Gefahr ist gross, dass du auf halbem Weg stehen bleibst. Und mit einem halb-reparierten Programm arbeiten... irgendwann fühlt sich das an, wie ausgelutschter Kaugummi.



> Weitere Bekannte Fehler/Einschrenkungen:
> -Druckfunktion druckt nur 1 Seite
> -Variablen-Gucker funktioniert nicht ganz
> -Variablen-Gucker zeigt nur Primitive Variablen, Strings und deren Arrays an
> ...


Eins nach dem anderen! Erst das Grundsystem, dann kommen die coolen Features. Und wenn das Grundsystem richtig designed wurde, können die Features auch ohne Probleme hinzugefügt werden :wink:
(Ich hab auch ein paar Jährchen benötigt, bis ich das akzeptierte).



> Danke für den sehr informativen Test!


Bitte


----------



## Lim_Dul (22. Jun 2006)

Beni hat gesagt.:
			
		

> > > Ich würde dir empfehlen:
> > > - Pro Button oder MenuItem einen ActionListener schreiben
> >
> >
> ...



Alternativ wenigstens Code der Form:


```
if (command.equals("Befehl1")) {
  methode1();
} else if (command.equals("Befehl2)) {
  methode2();
} else if {
...
} else {
  System.err.println("Hier wollte ich aber garnicht sein, irgendwas ist schiefgelaufen, der Befehl "+command+" wird nicht bearbeitet");
}
```
Damit sind die Sachen deutlich voneinander getrennt.



> Eins nach dem anderen! Erst das Grundsystem, dann kommen die coolen Features. Und wenn das Grundsystem richtig designed wurde, können die Features auch ohne Probleme hinzugefügt werden :wink:
> (Ich hab auch ein paar Jährchen benötigt, bis ich das akzeptierte).



Dito. Man hat tolle Ideen, was man machen will und irgendwann stellt man fest, dass der Code, den man produziert hat, einfach grauenhaft ist. Man findet sich irgendwann nicht mehr zurrecht, Erweiterungen oder neue Features an der einen Ecke bewirken Fehler an einer anderen Ecke. Irgendwann sieht man dann ein, dass man besser neu anfängt, sich diesmal Zeit vorher für das Design nimmt und man hinterher besseren Code. Dieser Prozess endet auch nie, nur werden die Schritte die man macht, meistens kleiner.


----------



## foobar (23. Jun 2006)

Von mir auch ein paar Tips für die Zukunft:

- Dir fehlt eine richtige Projektstruktur. Du brauchst auf jeden Fall einen src und einen bin-Ordner, alles andere ist Käse.

- Bitte keinen Deutschenbezeichner verwenden, das bringt nur Probleme und sieht doof aus.

- Halte dich wenn möglich an den Javastyleguide. Über die Einrückungen kann man sich streiten, aber der Rest ist essentiell.

- Verwende Ant zum bauen deiner Applikation, das macht vieles einfacher.

- Anstatt Batch und Shellscript solltest du ein Jar bauen(Ant hilft dir dabei), das kann man überall ausführen.

- Entweder du entscheidest dich für deutsche Beschriftungen in der GUI oder nicht, aber bilinguale Anwendungen schrecken mich ab ;-)

- Man kann zwar neue Dateien erstellen, aber nicht zwischen den Instanzen hin und herschalten.

- Bei den Menüpunkten Hilfe und Über würde ich ein Popup öffnen,  ansonsten bleibt das Textfeld später uach schwarz.

HTH

Viele Grüße
foobar


----------



## michi2 (23. Jun 2006)

foobar hat gesagt.:
			
		

> Von mir auch ein paar Tips für die Zukunft:
> - Dir fehlt eine richtige Projektstruktur. Du brauchst auf jeden Fall einen src und einen bin-Ordner, alles andere ist Käse.



Bin ganz deiner Meinung, wie kann ich javac eien Pfad geben in den es die compilierten Dateien speichern soll?



> - Halte dich wenn möglich an den Javastyleguide. Über die Einrückungen kann man sich streiten, aber der Rest ist essentiell.


Giebts den irgentwo zusammengefasst auf Deutsch?



> - Verwende Ant zum bauen deiner Applikation, das macht vieles einfacher.


Sorry, kenn ich nur vom Namen...



> - Anstatt Batch und Shellscript solltest du ein Jar bauen(Ant hilft dir dabei), das kann man überall ausführen.


Schon klar, nur hatte ich da wiegesagt Probleme.



> - Man kann zwar neue Dateien erstellen, aber nicht zwischen den Instanzen hin und herschalten.


Hä? Natürlich kann mann, oder was meinst du mit Instanz?



> - Bei den Menüpunkten Hilfe und Über würde ich ein Popup öffnen,  ansonsten bleibt das Textfeld später uach schwarz.


Ist nur bei Über, werd ich aber ändern




			
				Beni hat gesagt.:
			
		

> Als meine Java-Karriere begann, wollte ich ein Programm schreiben, das etwas ungeheur komplexes kann. Das Ergebnis war natürlich ernüchternd...
> Also schrieb ich das Programm nocheinmal, und nocheinmal. Und bei jedem dieser Sprünge wurde das Programm wesentlich besser, da ich vom vorherigen Versuch wusste, was diesmal anders sein soll.
> Die jeweils nächsten Versionen benötigten nicht mehr Zeit. Denn wenn man etwas zum zweiten mal schreibt, geht es wesentlich leichter. Bei alldem ist nur wichtig: es wird nichts vom alten Code kopiert.
> 
> Tjo, und ich denke dir würde es genau gleich gehen. Gigantische Fortschritte bei vergleichsweise moderatem Aufwand.


Nun so war das bei mir nie! In meiem Java-Buch wurde ein kleiner Editor (400 Zeilen) programmiert, ich hab dann zum lernen den Editor immer weiter und weiter ausgebaut (jetzt >5000 Zeilen). Ich hatte eigentlich vor nach dem "Haut-Erneuerungsprinzip" zu arbeiten:
   Die Haut erneuert sich in spätersten 6 Jahren komplett, mann verliert aber nie ganze Teile, nur einzelne Schuppen...
Bei meinem Java-Programm kann ich eine Datei/Klasse komplett über den Haufen werfen und sie neu programmieren, so Bleibt irgent wann nix mehr von ührsprünglichen (~jetzigen) Code übrig.
So hatte ich für die Zukunft geplannt: (Chronologisch)

*Wieder Vereinigung von "Singelfile" und Multifile-Version
*Teilung des Codes auf mehr Klassen und Dateien
*löschen aller statics! Und der unsinigen Vererbung von MichisEditor!
*Komplettes ausgliedern + komplettes löschen und neuschreibens der Undo/Redo-funtion
*Komplettes ausgliedern + komplettes löschen und neuschreibens der Compile-funtion
*Komplettes ausgliedern + komplettes löschen und neuschreibens der Drucker-funtion
*Umsteigen von JTextArea auf JTextPane/JEditorPane -> möglichkeit der realisierrung von Highliting

Ich denke diese Vorgehensweise würde sehr viel schneller und effizenter gehen, da ich nie längere Zeit auf einmahl Programmieren kann (Schule, Website, C++, Root, POV-Ray.......)
Was denkt ihr davon?

Um noch mal auf die Multifile-funktion zurück zu kommen, wie gut und proffessionell ist der Ansatz? Mir fällt nähmlich kein besserer ein!


----------



## foobar (23. Jun 2006)

> Hä? Natürlich kann mann, oder was meinst du mit Instanz?


Gibt es eine Möglichkeit z.b. über ein JTabbedpane eine bestimmte Datei anzusprechen, so daß man zwischen den einzelnen geöffneten Dateien hin und her schalten kann? So wie man das von Textpad oder Ultraedit kennt. Also jede geöffnete Datei ist ein JInternalFrame und hat einen Tab in eineme JTabbedpane, wenn man auf einen bestimmten Tab klickt, wird diese Datei in den Vordergrund geholt.



> Bin ganz deiner Meinung, wie kann ich javac eien Pfad geben in den es die compilierten Dateien speichern soll?


Da du mittlerweile weißt wie man ein Programm auf der Konsole kompiliert, rate ich dir eine IDE z.b. Eclipse zu verwenden. Dann ist auch die Antintegration kein Thema mehr. Wenn du willst baue ich dir aus dem Code ein fertiges Eclipseprojekt mit Antscript, dann haste du eine saubere Basis.



> Giebts den irgentwo zusammengefasst auf Deutsch?


Google ist dein Freund ;-)


----------



## michi2 (23. Jun 2006)

foobar hat gesagt.:
			
		

> > Hä? Natürlich kann mann, oder was meinst du mit Instanz?
> 
> 
> Gibt es eine Möglichkeit z.b. über ein JTabbedpane eine bestimmte Datei anzusprechen, so daß man zwischen den einzelnen geöffneten Dateien hin und her schalten kann? So wie man das von Textpad oder Ultraedit kennt. Also jede geöffnete Datei ist ein JInternalFrame und hat einen Tab in eineme JTabbedpane, wenn man auf einen bestimmten Tab klickt, wird diese Datei in den Vordergrund geholt.


Ja! Also ich will ja nix gegen deine Augen oder deinen Bildschirm sagen.... 



> > Bin ganz deiner Meinung, wie kann ich javac eien Pfad geben in den es die compilierten Dateien speichern soll?
> 
> 
> Da du mittlerweile weißt wie man ein Programm auf der Konsole kompiliert, rate ich dir eine IDE z.b. Eclipse zu verwenden. Dann ist auch die Antintegration kein Thema mehr. Wenn du willst baue ich dir aus dem Code ein fertiges Eclipseprojekt mit Antscript, dann haste du eine saubere Basis.


1.)Kannst du mir erklären was Ant ist
2.)Wofür das ganze? Alles was man braucht ist ein Editor(bei mir mein eigener), javac und ne Konsole! hab den javac parameter gefunden: "-d directory", in mein Kompieler-script reingeschrieben, und schon funktioniert das ganze! (Mit nem Profiler kann ich sie dann noch auf Geschwindigkeit optimieren)
Ich Öffnen und bearbeite die Dateien mit dem Editor, compiliere und starte sie mit den entsprchenden scripten, lass mir dabei dei class dateien in ein anderes Verzeichnis legen, und mache mit jar ein Jar-Achiv daraus?
In ne IDE muss ich mich erst einarbeiten, sie bindet mich an ein OS, ich muss sie auf allen PCs installieren mit dennen ich arbeiten will, ich muss mich an sie gewöhnen (für mich sind die unterschiedlichen Fonts bei Win und Linux schon nervend) und sie verbrauchen Platz!

Danke tortzdem an alle schon mal! Bitte um kommentare über die Multifile-Funktion!


----------



## michi2 (23. Jun 2006)

foobar hat gesagt.:
			
		

> > Giebts den irgentwo zusammengefasst auf Deutsch?
> 
> 
> Google ist dein Freund ;-)


Lies dir den Artikel in c't 10/2006 durch, danach ist *Google* nicht mehr dein Feund... 
Es lebe Exalead!


----------



## Beni (23. Jun 2006)

michi2 hat gesagt.:
			
		

> 1.)Kannst du mir erklären was Ant ist


Kennst du "make"? Ant ist was ganz ähnliches: mit einer Datei bestimmt man ein paar Aktionen die erledigt werden sollen (Kompilieren, Dokumentation erstellen, Jar's packen...), und kann dann mit einem Klick alles machen lassen.
IMHO macht das aber erst Sinn wenn auch wirklich viele Aktionen gemacht werden müssen :wink:



> 2.)Wofür das ganze? Alles was man braucht ist ein Editor(bei mir mein eigener), javac und ne Konsole! hab den javac parameter gefunden: "-d directory", in mein Kompieler-script reingeschrieben, und schon funktioniert das ganze! (Mit nem Profiler kann ich sie dann noch auf Geschwindigkeit optimieren)
> Ich Öffnen und bearbeite die Dateien mit dem Editor, compiliere und starte sie mit den entsprchenden scripten, lass mir dabei dei class dateien in ein anderes Verzeichnis legen, und mache mit jar ein Jar-Achiv daraus?
> In ne IDE muss ich mich erst einarbeiten, sie bindet mich an ein OS, ich muss sie auf allen PCs installieren mit dennen ich arbeiten will, ich muss mich an sie gewöhnen (für mich sind die unterschiedlichen Fonts bei Win und Linux schon nervend) und sie verbrauchen Platz!


Fast alle IDEs für Java sind platformunabhängig... und keine von ihnen benötigt Gigabytes Speicherplatz (selbst das Riesenprogramm Eclipse benötigt nur 100 MB).

Das hört sich nach "Was ich nicht kenne, interessiert mich nicht" an. Tja, dann will ich dich nicht weiter von Syntaxhighlighting, automatische Codevervollständig, Fehleranzeigen während der Eingabe, Vorschläge für Korrekturen, automatisches Importieren oder gar graphische Debugger erwärmen... ich meine, *du* machst dir hier unnötig viel Arbeit...  :bae:


----------



## michi2 (23. Jun 2006)

Werd mir mal Eclipse anschauen. Insofern würde ich das Angebot von foobar gern Annehmen, fals es noch gieldt. Weis aber nicht ob ich diese Features brauch...

*Bitte um kommentare über die Multifile-Funktion!*


----------



## foobar (23. Jun 2006)

@Michi so ich hab dein Projekt mal etwas aufgeräumt:

- Buildscript erstellt mit dem man das Projekt kompilieren, javadoc erzeugen und ein ein bin und ein src-jar erstellen kann.

- Alle Html und Txtfiles in ein eigenes Package verschoben.

- Deprecated-Methoden (show(boolean b) durch setVisible(boolean b)) ersetzt

- Eclipseprojekt erstellt und etwas Ordnung gemacht. Die Quellen liegen jetzt in src die Klassen in bin. Ant erstellt beim aufuf von ant dist einen temporäten build und dist-Ordner. Die fertigen Jars liegen dann in dist und können direkt aufgerufen werden seieh Manifest.

Gib mir mal deine E-Mailaddy, dann schicke ich dir das Projekt mit allem drum und dran.


----------



## foobar (23. Jun 2006)

> Ja! Also ich will ja nix gegen deine Augen oder deinen Bildschirm sagen....


Ok, ich habs gefunden. Es ist nur etwas verwirrend da die Auswahl der Datei in der selben Zeile steht wie die Formatierungen. Ein wichtige Regel in der Usability lautet: "Was zusammen gehört muß auch zusammen gruppiert werden." Ausserdem solltest du zwischen den Jomboboxen etwas Raum lassen, damit Fluchten entstehen und man sofort sieht was wozo gehört.


----------



## michi2 (23. Jun 2006)

foobar hat gesagt.:
			
		

> > Ja! Also ich will ja nix gegen deine Augen oder deinen Bildschirm sagen....
> 
> 
> Ok, ich habs gefunden. Es ist nur etwas verwirrend da die Auswahl der Datei in der selben Zeile steht wie die Formatierungen. Ein wichtige Regel in der Usability lautet: "Was zusammen gehört muß auch zusammen gruppiert werden." Ausserdem solltest du zwischen den Jomboboxen etwas Raum lassen, damit Fluchten entstehen und man sofort sieht was wozo gehört.


Ja, werds vieleich in ne eigene Zeile packen, muss da noch einbisschen rummspielen...

Warte noch auf eine Analyse meien Vorgehens für die Multifile-funktion (->4 Posting)


----------



## foobar (23. Jun 2006)

Zum Code:
- static ist evil!!! Du machst dir das Leben nur unnötig schwer. Selbst die Instanz deiner Hauptklasse in der Main-Methode ist static. Warum?

- Von Kapselung ist keine Spur, alle Member sind public oder Packagescoped. 

- Die Bezeichner sind irreführend. Teilweise verwendest du die C++-Form m_Something, manchmal werden die Klasse einfach nur mit M1-M-5 bezeichnet. Also alles Kraut und Rüben.

- Was soll das C am Anfang der Klassenbezichner?

- Die Klasse Michis-Editor ist viiiiiiiiiiiieeeeeeeeeeeel zu groß. Eine Klasse darf nicht mehr als ca. 500 und eine Methode nicht mehr als 100 zeilen enthalten. Ansonsten stimmt beim Klassedesign irgendwas nicht.

- Warum sind alle Klassen final?

- Warum verwendest du ein Array für die offenen Dateien anstatt einer Liste? Im Moment kann man nicht mehr als 128 Dateien öffnen und es werden auch immer 128 leere Objekte im Speicher gehalten.

- Du solltest generell den Code besser auteilen in GUI und Geschäftslogik. Z.b. in der Klasse MultiFile refernzierst du ein Widget aus der GUI, das ist nicht besonders schön. Besser wäre es wenn du über ein Interface auf die GUI zugreifst und dir Daten in Form von Beans holst.

P.S. Ich finde es sehr löblich, daß du dir selber so eine Aufgabe stellst, denn nur so kann man etwas lernen.

Viele Grüße
foobar

- Du solltest den Code auch etwas besser auf einzelne Packages verteilen z.b. pk/gui , pk/gui/filter etc. Damit du auch eine gewisse Trennung von GUI und Logikschicht hast.


----------



## michi2 (23. Jun 2006)

> - Die Bezeichner sind irreführend. Teilweise verwendest du die C++-Form m_Something, manchmal werden die Klasse einfach nur mit M1-M-5 bezeichnet. Also alles Kraut und Rüben.
> 
> - Was soll das C am Anfang der Klassenbezichner?


Das mit dem m und dem C muss wohl aus C++ kommen, in meiem Javabuch steht das ständeig, werds entfernen (die wo es ist, ausgenommen cfile - keinen besseren Nammen gefunden sind alle alt, mach das schon lange nicht mehr).
Dem Autor sollte mann dafür in dem Ar*** treten...



> - Du solltest generell den Code besser auteilen in GUI und Geschäftslogik. Z.b. in der Klasse MultiFile refernzierst du ein Widget aus der GUI, das ist nicht besonders schön. Besser wäre es wenn du über ein Interface auf die GUI zugreifst und dir Daten in Form von Beans holst.


Sorry, auch da muss ich passen, von Beans weiß ich nur das das irgentwas mit Java zu tun hat... 

Der rest: Einverstanden auch wen mir das mit den 500Z pro Klasse und 100Z por Methode schwer fallen wird, aber ich werds schaffen


----------



## foobar (23. Jun 2006)

> Der rest: Einverstanden auch wen mir das mit den 500Z pro Klasse und 100Z por Methode schwer fallen wird, aber ich werds schaffen


Das ist auch nur ein Richtwert, wenn es mal 800 Zeilen werden ist das nicht so schlimm. Aber wenn eine Software aus 10 Klassen zu jede 5000 Zeilen besteht, stimmt irgendwas nicht ;-)



> Dem Autor sollte mann dafür in dem Ar*** treten..


Ja, so ist das mit Code aus Büchern, da kannste froh sein, wenn der sich überhaupt kompilieren lässt. 



> Sorry, auch da muss ich passen, von Beans weiß ich nur das das irgentwas mit Java zu tun hat...


Eine Bean ist eine dummy Klasse die keine Logik enthält und dadui gedacht ist Daten zu halten. Such mal nach ValueObject-Pattern oder JavaBean hier im Forum.


----------



## michi2 (24. Jun 2006)

Kann mir jemannd sagen warum dieses Jar-Archiv nicht geht?
http://www.schoenitzer.de/Michis_Editor.jar
Achtung nicht die gleiche Version wie die über die dieser Threat handelt.

Hab die zip über die dieser Threat handelt jetzt verbessert, sie ist hier zum downloaden:
http://www.schoenitzer.de/MultiFile.zip


----------



## Beni (24. Jun 2006)

Da fehlt ein Ordner "pk" in der JAR. All deine Klassen sind in einem Package "pk.irgendwas", also muss auch die Ordnerstruktur im JAR mit "pk" beginnen.


----------



## michi2 (24. Jun 2006)

Und wie schaff ich das? Benütze wie in der FAQ beschrieben:
jar -cvfm meinjar.jar meman.txt -C /bin/pk /


----------



## Beni (24. Jun 2006)

Ich arbeite selten auf der Konsole, aber versuch mal
"jar -cvfm meinjar.jar meman.txt -C /bin /"


----------



## michi2 (24. Jun 2006)

Danke, bin aber grad im Moment wo du gepostet hast, selbst draufgekommen 

Um nochmal hirauf zurück zu kommen:

```
class cfile
   {
      String suchen;
      public int suchindex = -1;
     
      // globale Variablen innerhalb der Klasse
      public File einausgabedatei;                    // zu ladende/speichernde Datei
      public String m_dateiname_Name = "";                // reiner Name
      public String m_dateiname_Path = "";                 // reiner Pfad
      boolean m_dateiname_gueltig = false;
      public boolean search_up = false;
      public boolean bgenau = false;
      public boolean bcursor = false;
      //JMenuItem item3_2;
      public String m_aktText;               // aktueller Text in der TextArea
      String m_alterText;                  // alter Text der TextArea
      String[] m_alterTextNr = new String[10];            // alter Text der TextArea
      LinkedList m_undoTextNr = new LinkedList();      // Undo Text der TextArea
      LinkedList last_used = new LinkedList();      //Lastused
      JMenuItem[] item1_6_ = new JMenuItem[4];      //Die Lastused eintr�ge
      int[] markerNr = new int[127];         // Die Markerwerte
      JMenuItem[] item2_11b_ = new JMenuItem[127];   //Die 'gehe zu Marker' eintr�ge
      public JMenuItem[] item2_11c_ = new JMenuItem[127];   //Die 'L�se Marker' eintr�ge
      byte m_undoNumber = 0;         //Aktuelle undo-Position
      byte markerNumber = 0;         //Anzahl der Marker
      boolean gespeichert = false;
      public pk.CTextAnzeige m_textanzeige;      // die eigentliche TextArea
      public JTextArea TA;
      JPanel p_neu;
      JComboBox m_fonts,m_styles;           // Auswahl von Fonttyp, Stil und
      JComboBox m_farben;                      // Farbe
      JComboBox m_groese;         //Groese
      JScrollPane scroll;

      int cursorposition;
   
   
   void laden()
      {
      Michis_Editor.suchen = suchen;
      Michis_Editor.suchindex = suchindex;
      Michis_Editor.einausgabedatei = einausgabedatei;
      Michis_Editor.m_dateiname_Name = m_dateiname_Name;
      Michis_Editor.m_dateiname_Path = m_dateiname_Path;
      Michis_Editor.m_dateiname_gueltig = m_dateiname_gueltig;
      Michis_Editor.search_up = search_up;
      Michis_Editor.bgenau = bgenau;
      Michis_Editor.bcursor = bcursor;
      Michis_Editor.m_aktText = m_aktText;
      Michis_Editor.m_undoTextNr = m_undoTextNr;
      Michis_Editor.last_used = last_used;
      Michis_Editor.item1_6_ = item1_6_;
      Michis_Editor.item2_11c_ = item2_11c_;
      Michis_Editor.m_undoNumber = m_undoNumber;
      Michis_Editor.markerNumber = markerNumber;
      Michis_Editor.gespeichert = gespeichert;
      Michis_Editor.TA = TA;
      Michis_Editor.p_neu = p_neu;
      Michis_Editor.m_fonts = m_fonts;
      Michis_Editor.m_styles = m_styles;
      Michis_Editor.m_farben = m_farben;
      Michis_Editor.m_groese = m_groese;
      Michis_Editor.scroll = scroll;
      Michis_Editor.m_textanzeige = m_textanzeige;
      Michis_Editor.m_textanzeige.setText(m_aktText);
      Michis_Editor.m_textanzeige.setCaretPosition(cursorposition);

      if(!m_dateiname_Name.equals(""))
         Michis_Editor.e1.setTitle("Michi's Editor 3 - " + m_dateiname_Name);
      else
         Michis_Editor.e1.setTitle("Michi's Editor 3");
      }

   void speichern()
      {
      suchen =    Michis_Editor.suchen;
      suchindex =    Michis_Editor.suchindex;
      einausgabedatei =    Michis_Editor.einausgabedatei;
      m_dateiname_Name =    Michis_Editor.m_dateiname_Name;
      m_dateiname_Path =    Michis_Editor.m_dateiname_Path;
      m_dateiname_gueltig =    Michis_Editor.m_dateiname_gueltig;
      search_up =    Michis_Editor.search_up;
      bgenau =    Michis_Editor.bgenau;
      bcursor =    Michis_Editor.bcursor;
      m_aktText =    Michis_Editor.m_aktText;
      m_undoTextNr =    Michis_Editor.m_undoTextNr;
      last_used =    Michis_Editor.last_used;
      item1_6_ =    Michis_Editor.item1_6_;
      item2_11c_ =    Michis_Editor.item2_11c_;
      m_undoNumber =    Michis_Editor.m_undoNumber;
      markerNumber =    Michis_Editor.markerNumber;
      gespeichert =    Michis_Editor.gespeichert;
      TA =    Michis_Editor.TA;
      p_neu =    Michis_Editor.p_neu;
      m_fonts =    Michis_Editor.m_fonts;
      m_styles =    Michis_Editor.m_styles;
      m_farben =    Michis_Editor.m_farben;
      m_groese =    Michis_Editor.m_groese;
      scroll =    Michis_Editor.scroll;
      m_aktText = Michis_Editor.m_textanzeige.getText();
     m_textanzeige =    Michis_Editor.m_textanzeige;
     cursorposition = m_textanzeige.getCaretPosition();
      }
   void println()
   {
     System.out.println("cfile, TAtext: " + m_textanzeige.getText());
     System.out.println("cfile, text: " + m_aktText);
   }
}
```
Ist das in Ordnung? Welche anderen Möglichketen giebt es die Informationen zwischen zu speichern?


----------



## foobar (24. Jun 2006)

@Michi Warum benutzt die nicht das Buildscript das ich dir gebaut habe? Du mußt in der Konsole einfach nur ant dist eingeben und bekommst dann im dist-Ordner ein src/bin-Jar und einen Ordner mit den Javadocs.


----------



## michi2 (24. Jun 2006)

foobar hat gesagt.:
			
		

> @Michi Warum benutzt die nicht das Buildscript das ich dir gebaut habe? Du mußt in der Konsole einfach nur ant dist eingeben und bekommst dann im dist-Ordner ein src/bin-Jar und einen Ordner mit den Javadocs.


Hä? Welches Buildscript?


----------



## foobar (24. Jun 2006)

Na das Ant-Buildscript(build.xml), das liegt im Projektordner. Wenn du ant installiert hast kannst du einfach ant dist eingeben und bekommst eine fertige Distribution. Oder eben in Eclipse, dann ist es noch komfortabler.
http://de.wikipedia.org/wiki/Ant


----------



## michi2 (24. Jun 2006)

Nun, ich verstehe nicht was das für einen unterschied machen soll, ob ich jetzt Ant oder meine eigenen scripte benütze, habe jetzt 2 Ordner: einen wo mein Projekt mit folgender Ordnerstruktur:
Michis_Editor           //Über-Ordner
 >bin                   //Kompilierte Dateien
 > > pk
 > > > Michis_Editor.class
   ...                  //alle *.class-Dateien
 >scr                   //Source-Ordner
 > > pk
 > > > Michis_Editor.java
   ...
 >doc                   //Die Java-Dokumentation
 > > index.html
 > > pk
   ...
 > ME-comp              //Script zum Kommpilieren
 > ME-start             //           Starten
 > ME-doc               //       zur Erstellung der Documentation

Und eien mit dem vondir gemachten eclips-Project, welches ich benützen werde weiß ich noch nicht.


----------



## foobar (24. Jun 2006)

Dann guck dir mal auf der Webseite von ant an, was man alles damit machen kann und wie einfach das geht. Ausserdem bist du damit plattformunabhängig, ansonsten mußt du immer eine Batch und ein Shellscript erstellen und beide auf dem neusten Stand halten.

Mein Buildscript in meinem aktuellen Projekt kann folgendes:
- kompilieren
- javadoc erstellen
- jars erzeugen
- Obfuscator über die Jars laufen lassen
- Javahelp und Pdf-Handbuch aus Docbook generieren
- Installer für die gesamte Anwendung erstellen
- nativen Launcher mit gebundeltem JRE erstellen
....

Mach das mal mit einem Shellscript oder einer Batch, da bist du lange beschäftigt. Jetzt starte ich einfach nur mein Buildscript über  eine Tastenkombination in Eclipse und bekomme eine fertige Anwendung mit allem was man so braucht( siehe Liste oben).

Viele Grüße
foobar


----------

