# Datei in TextArea anzeigen



## Eva Zwerg (17. Nov 2009)

Hallo,

ich versuche gerade eine TextArea hinzubekommen, die mir Text- bzw. HTML-Dateien, die in einer Tabelle aufgelistet sind, nach Auswahl, anzeigt.

Die Dateien selber kann ich mir auf der Konsole ausgeben lassen, dass heißt der Pfad und die Datei sind jeweils in Ordnung.

Ich bekomme lediglich immer, wenn ich die Datei in die TextArea schreiben will, Fehler. 

Den ListSelectionListener hab ich so gebaut:

```
class SharedListSelectionHandler implements ListSelectionListener {
		public void valueChanged(ListSelectionEvent g) {
			
			if(g.getValueIsAdjusting() == true)
				  return;
			
			int auswahl = DateiTable.getSelectedRow();			
			
			new Textanzeige (e, dir, auswahl);
		}

}
```

Meine Textanzeige dazu sieht wie folgt aus:

```
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;


public class Textanzeige {
	
	public Textanzeige(Layout g, File dir, int auswahl){
		
		File[] f = dir.listFiles(new Dateifilter());
		File wahl = f[auswahl];
	
		try {
			FileReader in = new FileReader(wahl);
			
			g.AnzeigePane.read(in, wahl);

			in.close();
		} catch (FileNotFoundException e) {
			System.out.println("Datei nicht gefunden.");
		} catch (IOException e) {
			System.out.println("Fehler beim Lesen der Datei.");
		}

	}

}
```

Vielleicht weiß einer von euch was ich falsch mache?

Vielen Dank schon einmal für eure Hilfe.


----------



## ARadauer (17. Nov 2009)

```
g.AnzeigePane.read(in, wahl);
```
was macht dieser Code?



> wenn ich die Datei in die TextArea schreiben will, Fehler


Welchen Fehler?

(musste den beitrag jetzt 5 mal editieren, bis ich die quotes richtig hatte :autsch: ich brauch meinen kaffee)


----------



## KrokoDiehl (17. Nov 2009)

Aus diesen Code-Schnipseln werde ich nicht wirklich schlau. Das lesen geschieht offenbar in
[JAVA=17]            g.AnzeigePane.read(in, wahl);[/code]
und wäre wohl der interessantere Part, aber es sieht sehr ungewöhnlich aus.

Wie wäre es damit, dass du die anzuzeigende Datei einliest und den Text einer _JTextArea _oder _JEditorPane _hinzufügst?
Etwas á la:

```
public void showFile( File file, JTextArea txtArea ) throws IOException
{
    String         line      = null;
    BufferedReader reader    = new BufferedReader(new FileReader(file));
    StringBuffer   strBuffer = new StringBuffer();
    while ( (line = reader.readLine()) != null )
        strBuffer.append(line);    
    
    reader.close();
    txtArea.setText( strBuffer.toString() );
}
```
...muss nicht korrekt sein, aber so könnte es aussehen


----------



## Eva Zwerg (17. Nov 2009)

Dieser Code

```
g.AnzeigePane.read(in, wahl);
```
soll die Datei in das AnzeigePane im übergebenen Layout g anzeigen. Das funktioniert so auch schon an drei anderen Stellen des Codes z.B. hier:

```
g.PfadLabel.setText(p);
```

Der Code von KrokoDiehl funktioniert leider auch nicht. Bekomme immer noch folgende Fehlerausgabe in der Konsole:


> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> at Textanzeige.<init>(Textanzeige.java:32)
> at Tabelle$SharedListSelectionHandler.valueChanged(Tabelle.java:40)
> at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
> ...



Zeile 32 der Textanzeige ist eben der besagte Code-Schnipsel von oben und Zeile 40 in Tabelle ist dieser Schnipsel hier: 
	
	
	
	





```
new Textanzeige (e, dir, auswahl);
```

Wie gesagt, wenn ich mir so 

```
FileReader in = new FileReader(wahl);
		
BufferedReader br = new BufferedReader(in);
		
while (br.ready()){
           zeile=br.readLine();
           gesamt = gesamt + zeile + "\n";			
}
System.out.print(gesamt);
```
den Inhalt der Datei auf der Konsole anzeigen lasse, funktioniert alles.


----------



## Gast2 (17. Nov 2009)

Versuch doch mal die Methode

```
JTextArea area;
		area.read(Reader, Object);
```


----------



## KrokoDiehl (17. Nov 2009)

Na dann geh mal der NullPointerExc. nach. 

```
new Textanzeige (e, dir, auswahl);
```
Was passiert denn im Konstruktor von _Textanzeige_, welche der drei Parameter ist null...
Wenn das Einlesen funktioniert, liegt es an was anderem. So wie es aussieht beim Aufbauen / Erstellen der Textanzeige.

Übrigens ist

```
gesamt = gesamt + zeile + "\n";
```
keine gute Methode Strings zusammenzubauen. Benutzer lieber StringBuffer oder StringBuilder, das ist performanter.


----------



## Eva Zwerg (17. Nov 2009)

Der NullPointerExc. bin ich mal nachgegangen, und natürlich ist das Layout null. Und das leider auch schon im SharedListSelectionHandler. Nur wie bekomm ich das da am besten rein?

Die Tabelle selbst bekommt es nur übergeben.


```
public class Tabelle {
	JTable DateiTable;
	File dir;
	Layout e;
	
	
	public Tabelle(Layout g, String p){
		Layout e = g;
		e.PfadLabel.setText(p);
		dir = new File(p);
		FileTableModel model = new FileTableModel(dir);
		DateiTable = new JTable(model);
		DateiTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		e.DateiListePane.setViewportView(DateiTable);
		
		ListSelectionModel listSelectionModel;
		listSelectionModel = DateiTable.getSelectionModel();
		listSelectionModel.addListSelectionListener(new SharedListSelectionHandler());
		DateiTable.setSelectionModel(listSelectionModel);
	}
	
	class SharedListSelectionHandler implements ListSelectionListener {
		public void valueChanged(ListSelectionEvent g) {
			
			if(g.getValueIsAdjusting() == true)
				  return;
			
			int auswahl = DateiTable.getSelectedRow();		
			
			System.out.println(e);
			
			new Textanzeige (e, dir, auswahl);
		}

	}

...
}
```


----------



## KrokoDiehl (17. Nov 2009)

Du musst verstehen, dass ich von deiner Programmstruktur wenig Ahnung habe und noch weniger von den dahinterliegenden Überlegungen. Daher weiß ich nichts mit _Layout _anzufangen, sprich wofür es da ist, was es ist, und warum es nötig ist.
Aber offenbar braucht deine Tabelle ein _Layout_-Objekt, dass nicht _null _ist. Daher sehe ich prinzipiell die Sache so, dass _Tabelle _dann eine Ausnahme werfen muss oder selbst dafür sorgen muss, dass es ein _Layout _hat. Etwa sowas:
[JAVA=7]
    public Tabelle(Layout g, String p){
        // Möglk. A: Ausnahme
        if (g == null)
            throw new NullPointerException("layout ist null");
        // Möglk. B: Selbstversorger
        if (g == null)
                g = new Layout(); //oder wie man es auch immer erzeugt

        Layout e = g;
        e.PfadLabel.setText(p);
        dir = new File(p);
        FileTableModel model = new FileTableModel(dir);
        DateiTable = new JTable(model);
        DateiTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        e.DateiListePane.setViewportView(DateiTable);

        ListSelectionModel listSelectionModel;
        listSelectionModel = DateiTable.getSelectionModel();
        listSelectionModel.addListSelectionListener(new SharedListSelectionHandler());
        DateiTable.setSelectionModel(listSelectionModel);
    }
[/code]

Du kannst aber auch weiter nach außen gehen und schauen, wo der _Tabelle_-Konstruktor aufgerufen wird und warum dort das _Layout __null _ist...


----------



## Eva Zwerg (17. Nov 2009)

Wenn ich in Tabelle selbst mir g auf der Konsole ausgeben lasse bekomme ich


> Layout[frame0,0,0,630x470,layout=java.awt.BorderLayout,title=Java Datei-Explorer,resizable,normal,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,28,614x434,layout=javax.swing.JRootPane$RootLayout, alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]


Das ist quasi das was man sonst mit getContentPane() bekommt. Also mein Layout Grundgerüst auf dem ich die Komponenten platzieren kann.
Das heißt das Layout kommt in Tabelle an, muss aber irgendwie an den SharedListSelectionHandler weitergegeben werden, damit der das an Textverarbeitung weitergibt.

Ich hoffe ihr versteht mich?! :bahnhof:


----------



## KrokoDiehl (17. Nov 2009)

Ach so. Kann es sein dass der _SelectionListener _schon ziemlich früh aufgerufen wird, sprich während deine GUI noch aufgebaut wird?
Pack um den Aufruf von

```
new Textanzeige (e, dir, auswahl);
```
in 
	
	
	
	





```
valueChanged()
```
 doch mal eine if-Abfrage die die Parameter auf null prüft und dann eben nichts macht. Es kann nämlich schon sein, dass beim Erstellen der Tabelle, bzw. beim Setzen eines _SelectionListeners _dieser aufgerufen wird.


----------



## Eva Zwerg (17. Nov 2009)

Wenn ich mir im SharedListSelectionHandler mit 
	
	
	
	





```
System.out.println(e);
```
 das Layout ausgeben lassen will, bekomme ich auch schon null zurück.
Daher geht er in der if- Abfrage erst gar nicht in die else Verzweigung rein und startet Textanzeige.

Muss ich Layout e irgendwie anders deklarieren, damit der SharedListSelectionHandler es kennt?


----------



## KrokoDiehl (17. Nov 2009)

Holla! Was eine tückische Falle... hab ich auch grade erst bemerkt:

```
public class Tabelle {
    JTable DateiTable;
    File dir;
    Layout e; // Attribut e aus der Klasse Tabelle
```


```
public Tabelle(Layout g, String p){
        Layout e = g; // lokale Variable! also nicht das e aus der Tabelle
        // so muss es sein:
        e = g;
```


```
System.out.println(e); // e aus der Tabelle
            
            new Textanzeige (e, dir, auswahl); // dito
```
Du setzt im Konstruktor nicht das Attribut sondern eine lokale Variable! Daher ist es im Listener noch null, weil 
	
	
	
	





```
Tabelle.e
```
 nie initialisiert wird.


----------



## Eva Zwerg (17. Nov 2009)

Uff... ich hab mir gedacht, dass ich einen dummen Fehler gemacht habe, aber sooo dumm?? 

Vielen vielen Dank für deine / eure Hilfe! :toll: Es funktioniert jetzt. :applaus:


----------

