TextArea, RandomAccessFile, Apend und andere Tricks...

Surfforfun

Mitglied
Hallo!
Gegeben sind 2 Klassen - die Erste erzeugt eine TextArea, der Aufruf erfolgt aus der Zweiten heraus.
Die Kommentare /*....*/ sind später noch wichtig.

Die zweite Klasse enthält die Methode main. Eine Text Area wird mit der ersten Klasse "TextFlaeche" erzeugt. Der Quelltext der ersten Klasse wird mit RandomAccessFile gelesen und im Array "content" gespeichert.
Der Text wird mit append() zeilenweise in die TextArea geschrieben - und zwar kopfüber! (nicht meine Idee!) Die Zeilen werden nummeriert...
Die mehrzeiligen Kommentare sollen dabei ausgelassen werden (/*...*/)!
Ich habe das mit einer Variablen kommentarVanish hinbekommen, die ich einschalte (/*) und wieder ausschalte (*/).
Warum werden die Zeilen nicht ausgeblendet, bei denen der Kommentar beginnt (/*Diese Klasse ist...)


Java:
import java.awt.*;
import java.awt.event.*;

/* Diese Klasse ist ein Frame das eine TextArea enthhaelt.
   In dieser TextArea kann man Zeilenweise Texte Schreiben
   indem man die Methode append(String s) der Klasse TextArea 
   aufruft.
*/



/*public class TextFlaeche extends Frame {  //Hier faengt die Klasse an
  TextArea ta ;
  public TextFlaeche(String s){
    super(s);
    ta = new TextArea(30,100);  //Die TextArea wird initialisiert
    add(ta);
    pack();
    addWindowListener(new WindowAdapter()
      { public void windowClosing(WindowEvent e){System.exit(0);}});
    setVisible(true);
  }
} //Ende der Klasse
*/

public class TextFlaeche extends Frame { 
  
  TextArea ta ;
  
  public TextFlaeche(){
     ta = new TextArea(30,100);
     add(ta);
    pack();
    
     addWindowListener(new WindowAdapter()
    { public void windowClosing(WindowEvent e) 
      {System.exit(0);}});
     setVisible(true);
    
  }
}

Java:
import java.io.*;

public class AutoShow {
  
  public static void main(String[] args) {
    String[] content = new String[1000];
    
    try {
      RandomAccessFile quell = new RandomAccessFile("TextFlaeche.java", "r");
      TextFlaeche  tf1 = new TextFlaeche();      
      int counter = 0;
      
      boolean kommentarVanish = false;
      
      long seek = 0;
      long length = quell.length();
      
      while(seek < length) { 
        String s = quell.readLine();
        content[counter] = s;
        seek = quell.getFilePointer();
        counter++;
      }  
      quell.close();
      System.out.println("Number of lines (ohne Kommentar): "+counter);
      int lineNumber = counter;
      
      for(int i=0; i<counter; i++){
        
        if (content[(counter-1)-i].contains("*/")){
          kommentarVanish = true;
        }
        if (content[(counter-1)-i].contains("/*")){
          kommentarVanish = false;
        }
        //if (!kommentarVanish){ 
        if (kommentarVanish) continue;
        tf1.ta.append(lineNumber+" "+content[(counter-1)-i]+"\r\n");
        lineNumber = lineNumber-1;
        //}
      }
      System.out.println("done");
      
    } catch (IOException e)
    { e.printStackTrace(); }
  }
}
 
[EDIT][/EDIT]
Java:
for(int i=0; i<counter; i++){
        System.out.println("Durchlauf: "+i+" (counter-1)-i: "+((counter-1)-i));
        if (content[(counter-1)-i].contains("*/")){
          kommentarVanish = true;
...

Sieht gut aus: Die Array-Elemente werden von 41-0 runter gezählt!

Durchlauf: 0 (counter-1)-i: 41
...
Durchlauf: 41 (counter-1)-i: 1 [EDIT]bis 0 meine ich![/EDIT]

Und jetzt sollen noch die Kommentare, also die beiden Zeilen, die mit /* beginnen raus!
Es kommt ja auch so ungefähr hin, die Zeilen werden entfernt, wenn "kommentarVanish" true wird!
Warum aber werden die ersten Zeilen trotzdem appended??
Ist es so, dass "kommentarVanish" zu spät aktualisiert wird?
Als lokale Variable in der Schleife deklariert kommt jedenfalls das gleiche Ergebnis!
 
Zuletzt bearbeitet:
Ich meine:
Java:
System.out.println("Durchlauf: "+((counter-1)-i)+" = "+content[(counter-1)-i]);
um den jeweiligen Inhalt von content zu sehen, ob "*/" oder "/*" überhaupt gefunden werden kann.
 
Zuletzt bearbeitet:
Das gibt dann den ganzen Quelltext aus - mit diesen Zeilen, die mit */ und /* beginnen.
komisch ist, dass das rückwärts sein soll... aber dann ist */ zum Anfang und /* zum Ende der Feldbegrenzung dessen, was nicht ausgegeben werden soll richtig!
 
Wenn
Java:
if (content[(counter-1)-i].contains("/*")){
 
 kommentarVanish = false;
  
}

dann schreibst du ab dieser ab dieser Zeile wieder in deine Textarea.
Aber genau diese Zeile soll ja noch nicht rein (weil: noch Kommentarzeile) sondern erst die nächste.


Java:
einfacher Vorschlag: 
if (content[(counter-1)-i].contains("/*")){
  
   kommentarVanish = false;
   continue;
}
 
Zuletzt bearbeitet:
Ich freue mich!!! Vielen Dank =)

Also, dass ist die eine Klasse mit vielen Kommentaren zwischen /* und */:

Java:
import java.awt.*;
import java.awt.event.*;

/* Diese Klasse ist ein Frame das eine TextArea enthhaelt.
   In dieser TextArea kann man Zeilenweise Texte Schreiben
   indem man die Methode append(String s) der Klasse TextArea 
   aufruft.
*/



/*public class TextFlaeche extends Frame {  //Hier faengt die Klasse an
  TextArea ta ;
  public TextFlaeche(String s){
    super(s);
    ta = new TextArea(30,100);  //Die TextArea wird initialisiert
    add(ta);
    pack();
    addWindowListener(new WindowAdapter()
      { public void windowClosing(WindowEvent e){System.exit(0);}});
    setVisible(true);
  }
} //Ende der Klasse
*/

public class TextFlaeche extends Frame { 
  
  TextArea ta ;
  
  public TextFlaeche(){
     ta = new TextArea(30,100);
     add(ta);
    pack();
    
     addWindowListener(new WindowAdapter()
    { public void windowClosing(WindowEvent e) 
      {System.exit(0);}});
     setVisible(true);
    
  }
}

Dann die ander Klasse, die den Quelltext der Ersten liest und rückwärts in die TextArea der erten Klasse schreibt (mit nummerierten Zeilen...).
Dabei wird mit der Variablen kommentarVanish ein und ausgeschaltet, um Zeilen zu überspringen. Die Zeile, die noch Kommentar ist, obwohl kommentarVanish wieder false ist, wird mit continue; übersprungen - darunter steht die append()-Anweisung, die Zeilen zur TextArea hinzufügt. Continue überspring das und es geht direkt zur nächsten For-Schleifen-Iteration:

Java:
import java.io.*;

public class AutoZeigeLineNumberUmgekehrtUeberspringe {
  
  public static void main(String[] args) {
    String[] content = new String[1000];
    
    try {
      RandomAccessFile quell = new RandomAccessFile("TextFlaeche.java", "r");
      TextFlaeche  tf1 = new TextFlaeche();      
      int counter = 0;
      
      boolean kommentarVanish = false;
      
      long seek = 0;
      long length = quell.length();
      
      while(seek < length) { 
        String s = quell.readLine();
        content[counter] = s;
        seek = quell.getFilePointer();
        counter++;
      }  
      quell.close();
      System.out.println("Number of lines: "+counter);
      int lineNumber = counter;
      
      for(int i=0; i<counter; i++){
        //System.out.println("Durchlauf: "+i+" (counter-1)-i: "+((counter-1)-i));
        System.out.println("Durchlauf: "+((counter-1)-i)+" = "+content[(counter-1)-i]);
        if (content[(counter-1)-i].contains("*/")){
          kommentarVanish = true;
        }
        if (content[(counter-1)-i].contains("/*")){
          kommentarVanish = false;
          continue;
        }
        //if (!kommentarVanish){ 
        if (kommentarVanish) continue;
        tf1.ta.append(lineNumber+" "+content[(counter-1)-i]+"\r\n");
        lineNumber = lineNumber-1;
        //}
      }
      System.out.println("done");
      
    } catch (IOException e)
    { e.printStackTrace(); }
  }
}
 

Neue Themen


Zurück
Oben