Datei in TextArea anzeigen

Status
Nicht offen für weitere Antworten.

Eva Zwerg

Mitglied
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:
Java:
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:
Java:
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.
 
Java:
  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)
 
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:
Java:
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 🙂
 
Dieser Code
Java:
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:
Java:
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)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.setValueIsAdjusting(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.setValueIsAdjusting(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Zeile 32 der Textanzeige ist eben der besagte Code-Schnipsel von oben und Zeile 40 in Tabelle ist dieser Schnipsel hier:
Java:
new Textanzeige (e, dir, auswahl);

Wie gesagt, wenn ich mir so
Java:
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.
 
Versuch doch mal die Methode
Java:
		JTextArea area;
		area.read(Reader, Object);
 
Na dann geh mal der NullPointerExc. nach.
Java:
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
Java:
gesamt = gesamt + zeile + "\n";
keine gute Methode Strings zusammenzubauen. Benutzer lieber StringBuffer oder StringBuilder, das ist performanter.
 
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.

Java:
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);
		}

	}

...
}
 
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...
 
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:
 
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
Java:
new Textanzeige (e, dir, auswahl);
in
Code:
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.
 
Wenn ich mir im SharedListSelectionHandler mit
Code:
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?
 
Holla! Was eine tückische Falle... hab ich auch grade erst bemerkt:
Java:
public class Tabelle {
    JTable DateiTable;
    File dir;
    Layout e; // Attribut e aus der Klasse Tabelle
Java:
    public Tabelle(Layout g, String p){
        Layout e = g; // lokale Variable! also nicht das e aus der Tabelle
        // so muss es sein:
        e = g;
Java:
            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
Code:
Tabelle.e
nie initialisiert wird.
 
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:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben