Swing JTable + SelectionListener

Status
Nicht offen für weitere Antworten.

mstoetzer

Mitglied
Hallo,

ich versuche gerade einen SelectionListener zu bauen der dafür sorgt, dass die txt bzw. html Dateien im unteren JScrollPane angezeigt werden. Die Dateiausgabe wollte ich so realisieren:

Java:
public static void main(String[] args)
   {
     FileReader f;
     int c;
 
     try {
       f = new FileReader("D:\\SYS\\windows7.html");
       while ((c = f.read()) != -1) {
          System.out.print((char)c);
       }
       f.close();
     } catch (IOException e) {
       System.out.println("Fehler beim Lesen der Datei");
     }
   }

Aber ich habe schon Probleme bei den Basics. In Zeile 20 wirft Eclipse den Fehler: "SelectionListener cannot be resolved to a type" aus.

Java:
import javax.swing.*;
import javax.swing.table.*;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Date;

public class FileTableDemo {
	public static void main(String[] args) {
		// directory
		File dir = new File(System.getProperty("user.home"));

		// TableModel
		FileTableModel model = new FileTableModel(dir);

		// JTable
		JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
		sp.setLeftComponent(new JScrollPane(new JTable(model)));
		sp.addSelectionListener(new SelectionListener() {
			public void mouseClicked(SelectionEvent e) {
				System.out.println("Klappt");
			}
		});

		sp.setRightComponent(new JScrollPane(new JTable()));

		// Fenster
		JFrame frame = new JFrame("FileTableDemo");
		frame.getContentPane().add(new JScrollPane(sp), "Center");
		frame.setSize(1024, 800);
		frame.setVisible(true);
	}
}

class FileTableModel extends AbstractTableModel {
	protected File dir;
	protected String[] filenames;

	protected String[] columnNames = new String[] { "name", "size",
			"last modified", "directory?", "readable?", "writable?" };

	protected Class[] columnClasses = new Class[] { String.class, Long.class,
			Date.class, Boolean.class, Boolean.class, Boolean.class };

	public FileTableModel(File dir) {

		this.dir = dir;
		this.filenames = dir.list();
	}

	// Anzahl Spalten
	public int getColumnCount() {
		return 5;
	}

	// Anzahl Fils im Verzeichnis
	public int getRowCount() {
		return filenames.length;
	}

	// Informationen
	public String getColumnName(int col) {
		return columnNames[col];
	}

	public Class getColumnClass(int col) {
		return columnClasses[col];
	}

	public Object getValueAt(int row, int col) {

		File f = new File(dir, filenames[row]);
		switch (col) {
		case 0:
			return filenames[row];
		case 1:
			return new Long(f.length());
		case 2:
			return new Date(f.lastModified());
		case 3:
			return f.canRead() ? Boolean.TRUE : Boolean.FALSE;
		case 4:
			return f.canWrite() ? Boolean.TRUE : Boolean.FALSE;
		default:
			return null;
		}
	}
}
 
Java:
		JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
		sp.setLeftComponent(new JScrollPane(new JTable(model)));
		sp.addSelectionListener(new SelectionListener() {
			public void mouseClicked(SelectionEvent e) {
				System.out.println("Klappt");
			}
		});
1. JSplitPane (bzw. jegliche Swing Kompontete) besitzt keine Methode addSelectionListener
2. SelectionListener ist keine Standard Java Klasse, das Interface oder die Klasse musst Du selbst schreiben
 
Danke für die Hinweise. Ich habe das jetzt so weit umgebaut, dass ich einen ListSelectionListener verwende und eine Klasse "SharedListSelectionHandler" angelegt habe.
Das Problem ist wie kann ich den Listener auf das Modell anwenden? Wenn ich die Syntax für eine Tabelle verwende bekomme ich den Fehler:
The method setSelectionModel(ListSelectionModel) is undefined for the type FileBrowser.FileTableModel

Java:
listSelectionModel = model.getSelection();

Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File;
import java.util.Date;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;

public class FileBrowser extends JFrame {

	// default & aktuelles Verzeichnis
	File dir = new File("C:\\");

	// Verzeichnisbaum
	private JFileTree t = new JFileTree();

	// Header Pfadangabe
	private JLabel l = new JLabel(" ");

	// Hauptfenster JTable & JTextArea
	JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);

	// TableModel
	FileTableModel model = new FileTableModel(dir);

	// ListSelectionModel
	ListSelectionModel listSelectionModel;

	// Output
	JTextArea output = new JTextArea(1, 10);

	public FileBrowser() {
		super("FileBrowser");

		createAndAddSplitPane();

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		this.setSize(1024, 800);

		t.getSelectionModel().addTreeSelectionListener(
				new TreeSelectionListener() {
					private File file;
					private File[] files;
					private DefaultMutableTreeNode dmt;
					private Object[] o;
					private String s = "";

					public void valueChanged(TreeSelectionEvent e) {
						dmt = null;
						dmt = (DefaultMutableTreeNode) e
								.getNewLeadSelectionPath()
								.getLastPathComponent();

						o = dmt.getUserObjectPath();
						s = "";
						for (Object ob : o) {
							s = s + ob;
						}

						file = new File(s);

						l.setText(file.getAbsolutePath());

						if (file.isDirectory())
							if ((files = file.listFiles()).length > 0) {
								dmt.removeAllChildren();
								for (int ast = 0; ast < files.length; ast++) {
									if (files[ast].isDirectory())
										dmt.add(new DefaultMutableTreeNode(
												files[ast].getName() + "\\"));
								}
								t.validate();
							}

						// Auslesen der Files in einem Verzeichnis
						File dir = new File(file.getAbsolutePath());
						model.setDir(dir);

					}
				});

		this.add(l, BorderLayout.NORTH);
		this.add(new JScrollPane(t), BorderLayout.WEST);
		this.add(new JScrollPane(sp), BorderLayout.CENTER);
		sp.setOneTouchExpandable(true);
		sp.setContinuousLayout(true);

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new FileBrowser();
	}

	public void createAndAddSplitPane() {
		sp.setLeftComponent(new JScrollPane(new JTable(model)));

		listSelectionModel = model.getSelection();
		listSelectionModel
				.addListSelectionListener(new SharedListSelectionHandler());
		model.setSelectionModel(listSelectionModel);

		sp.setRightComponent(new JScrollPane(new JTextArea()));

	}

	class JFileTree extends JTree {

		public JFileTree() {
			this.setModel(new DefaultTreeModel(this.getRoot()));
			this.setCellRenderer(new FileRenderer());
		}

		public DefaultMutableTreeNode getRoot() {
			File[] files = dir.listFiles();
			DefaultMutableTreeNode root = new DefaultMutableTreeNode(dir
					.getPath());
			for (int ast = 0; ast < files.length; ast++) {
				if (files[ast].isDirectory())
					root.add(new DefaultMutableTreeNode(files[ast].getName()
							+ "\\"));
			}
			return root;
		}

		class FileRenderer extends DefaultTreeCellRenderer {
			private Icon directoryIcon;

			public FileRenderer() {
				directoryIcon = this.getDefaultClosedIcon();
			}

			@Override
			public Component getTreeCellRendererComponent(JTree tree,
					Object value, boolean sel, boolean expanded, boolean leaf,
					int row, boolean hasFocus) {

				super.getTreeCellRendererComponent(tree, value, sel, expanded,
						leaf, row, hasFocus);
				if (isDirectory(value))
					setIcon(directoryIcon);
				return this;
			}

			private Object[] o;
			private String s;
			private File file;

			protected boolean isDirectory(Object value) {
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
				o = node.getUserObjectPath();
				s = "";
				for (Object ob : o) {
					s = s + ob;
				}
				file = new File(s);
				if (file.isDirectory())
					return true;
				else
					return false;
			}
		}
	}

	class FileTableModel extends AbstractTableModel {

		protected File dir;
		protected String[] filenames;

		protected String[] columnNames = new String[] { "name", "size",
				"last modified", "type directory?", "readable?", "writable?" };

		protected Class[] columnClasses = new Class[] { String.class,
				Long.class, Date.class, Boolean.class, Boolean.class,
				Boolean.class };

		public void setDir(File dir) {
			this.dir = dir; // neues dir übernehmen
			this.filenames = dir.list();
			this.fireTableDataChanged(); // dem View (JTable) mitteilen, dass
			// sich die Daten geändert haben
		}

		// This table model works for any one given directory
		public FileTableModel(File dir) {
			this.dir = dir;
			this.filenames = dir.list(); // Store a list of files in the
			// directory
		}

		// These are easy methods.
		public int getColumnCount() {
			return 6;
		} // A constant for this model

		public int getRowCount() {
			return filenames.length;
		} // # of files in dir

		// Information about each column.
		public String getColumnName(int col) {
			return columnNames[col];
		}

		public Class getColumnClass(int col) {
			return columnClasses[col];
		}

		public Object getValueAt(int row, int col) {
			File f = new File(dir, filenames[row]);
			switch (col) {
			case 0:
				return filenames[row];
			case 1:
				return new Long(f.length());
			case 2:
				return new Date(f.lastModified());
			case 3:
				return f.isDirectory() ? Boolean.TRUE : Boolean.FALSE;
			case 4:
				return f.canRead() ? Boolean.TRUE : Boolean.FALSE;
			case 5:
				return f.canWrite() ? Boolean.TRUE : Boolean.FALSE;
			default:
				return null;
			}
		}
	}

	class SharedListSelectionHandler implements ListSelectionListener {
		public void valueChanged(ListSelectionEvent e) {
			ListSelectionModel lsm = (ListSelectionModel) e.getSource();

			System.out.println("es klappt");
		}
	}
}
 
Zuletzt bearbeitet:
[JAVA=108]listSelectionModel = model.getSelection();
listSelectionModel
.addListSelectionListener(new SharedListSelectionHandler());
model.setSelectionModel(listSelectionModel);[/code]
Zum einen besitzt Dein model (FileTableModel) keine Methoden getSelection() (Zeile 108) und setSelectionModel(...) (Zeile 111)
Und zum anderen macht das da oben grundsätzlich keinen Sinn
 
Meinst Du diese Zeilen?
Java:
listSelectionModel = table.getSelectionModel();
listSelectionModel.addListSelectionListener(new SharedListSelectionHandler());
table.setSelectionModel(listSelectionModel);
Schaut ein bisschen anders aus als bei Dir!!
Was mich allerdings ein bisschen stutzig macht ist die dritte Zeile. Die sollte eigentlich gar nicht notwendig sein??
[edit]
Achso der entscheidende Hinweis:
table ist hier eine Instanz von JTable <--> model bei Dir ist eine Instanz von AbstractTableModel
hier wird getSelectionModel() verwendet <--> Du rufst getSelection() auf
 
Zuletzt bearbeitet:
Achso der entscheidende Hinweis:
table ist hier eine Instanz von JTable <--> model bei Dir ist eine Instanz von AbstractTableModel
hier wird getSelectionModel() verwendet <--> Du rufst getSelection() auf

Das hatte ich geändert, da ich ja die Tabelle über das Modell definiere. das Problem ist das ich auf das Modell weder getSelectionModel() noch getSelection() anwenden kann.
 
Das hatte ich geändert, da ich ja die Tabelle über das Modell definiere. das Problem ist das ich auf das Modell weder getSelectionModel() noch getSelection() anwenden kann.
Weil das Model diese Methoden nicht besitzt. die Methode getSelectionModel() ist nur auf die JTable anwendbar, da nur diese ein SelectionModel besitzen kann - macht ja nicht unbedingt Sinn wenn ein Datenmodell ein SelectionModel besitzt. Für Dich gilt:
Java:
FileTableModel model = new FileTableModel(dir);
JTable table = new JTable(model);
...
table.getSelectionModel().addListSelectionListener(new SharedListSelectionHandler());
 
Der Fehler ist weg Danke! Aber müsste ich jetzt nicht wenigstens die Ausgabe über die Konsole sehen?
Java:
class SharedListSelectionHandler implements ListSelectionListener {
		public void valueChanged(ListSelectionEvent e) {
			System.out.println("es klappt");
		}
	}
 
Der Fehler ist weg Danke! Aber müsste ich jetzt nicht wenigstens die Ausgabe über die Konsole sehen?
Java:
class SharedListSelectionHandler implements ListSelectionListener {
		public void valueChanged(ListSelectionEvent e) {
			System.out.println("es klappt");
		}
	}
Ja, sobald sich die Selektion in der Tabelle ändert, sollte die Ausgabe erfolgen - sogar zweimal.
 
Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File;
import java.util.Date;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;

public class FileBrowser extends JFrame {

	// default & aktuelles Verzeichnis
	File dir = new File("C:\\");

	// Verzeichnisbaum
	private JFileTree t = new JFileTree();

	// Header Pfadangabe
	private JLabel l = new JLabel(" ");

	// Hauptfenster JTable & JTextArea
	JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);

	// TableModel
	FileTableModel model = new FileTableModel(dir);

	// ListSelectionModel
	ListSelectionModel listSelectionModel;
	JTable table = new JTable(model);

	// Output
	JTextArea output = new JTextArea(1, 10);

	public FileBrowser() {
		super("FileBrowser");

		createAndAddSplitPane();

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		this.setSize(1024, 800);

		t.getSelectionModel().addTreeSelectionListener(
				new TreeSelectionListener() {
					private File file;
					private File[] files;
					private DefaultMutableTreeNode dmt;
					private Object[] o;
					private String s = "";

					public void valueChanged(TreeSelectionEvent e) {
						dmt = null;
						dmt = (DefaultMutableTreeNode) e
								.getNewLeadSelectionPath()
								.getLastPathComponent();

						o = dmt.getUserObjectPath();
						s = "";
						for (Object ob : o) {
							s = s + ob;
						}

						file = new File(s);

						l.setText(file.getAbsolutePath());

						if (file.isDirectory())
							if ((files = file.listFiles()).length > 0) {
								dmt.removeAllChildren();
								for (int ast = 0; ast < files.length; ast++) {
									if (files[ast].isDirectory())
										dmt.add(new DefaultMutableTreeNode(
												files[ast].getName() + "\\"));
								}
								t.validate();
							}

						// Auslesen der Files in einem Verzeichnis
						File dir = new File(file.getAbsolutePath());
						model.setDir(dir);

					}
				});

		this.add(l, BorderLayout.NORTH);
		this.add(new JScrollPane(t), BorderLayout.WEST);
		this.add(new JScrollPane(sp), BorderLayout.CENTER);
		sp.setOneTouchExpandable(true);
		sp.setContinuousLayout(true);

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new FileBrowser();
	}

	public void createAndAddSplitPane() {
		sp.setLeftComponent(new JScrollPane(new JTable(model)));

		listSelectionModel = table.getSelectionModel();
		listSelectionModel
				.addListSelectionListener(new SharedListSelectionHandler());
		table.setSelectionModel(listSelectionModel);

		sp.setRightComponent(new JScrollPane(new JTextArea()));
	}

	class JFileTree extends JTree {

		public JFileTree() {
			this.setModel(new DefaultTreeModel(this.getRoot()));
			this.setCellRenderer(new FileRenderer());
		}

		public DefaultMutableTreeNode getRoot() {
			File[] files = dir.listFiles();
			DefaultMutableTreeNode root = new DefaultMutableTreeNode(dir
					.getPath());
			for (int ast = 0; ast < files.length; ast++) {
				if (files[ast].isDirectory())
					root.add(new DefaultMutableTreeNode(files[ast].getName()
							+ "\\"));
			}
			return root;
		}

		class FileRenderer extends DefaultTreeCellRenderer {
			private Icon directoryIcon;

			public FileRenderer() {
				directoryIcon = this.getDefaultClosedIcon();
			}

			@Override
			public Component getTreeCellRendererComponent(JTree tree,
					Object value, boolean sel, boolean expanded, boolean leaf,
					int row, boolean hasFocus) {

				super.getTreeCellRendererComponent(tree, value, sel, expanded,
						leaf, row, hasFocus);
				if (isDirectory(value))
					setIcon(directoryIcon);
				return this;
			}

			private Object[] o;
			private String s;
			private File file;

			protected boolean isDirectory(Object value) {
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
				o = node.getUserObjectPath();
				s = "";
				for (Object ob : o) {
					s = s + ob;
				}
				file = new File(s);
				if (file.isDirectory())
					return true;
				else
					return false;
			}
		}
	}

	class FileTableModel extends AbstractTableModel {

		protected File dir;
		protected String[] filenames;

		protected String[] columnNames = new String[] { "name", "size",
				"last modified", "type directory?", "readable?", "writable?" };

		protected Class[] columnClasses = new Class[] { String.class,
				Long.class, Date.class, Boolean.class, Boolean.class,
				Boolean.class };

		public void setDir(File dir) {
			this.dir = dir; // neues dir übernehmen
			this.filenames = dir.list();
			this.fireTableDataChanged(); // dem View (JTable) mitteilen, dass
			// sich die Daten geändert haben
		}

		// This table model works for any one given directory
		public FileTableModel(File dir) {
			this.dir = dir;
			this.filenames = dir.list(); // Store a list of files in the
			// directory
		}

		// These are easy methods.
		public int getColumnCount() {
			return 6;
		} // A constant for this model

		public int getRowCount() {
			return filenames.length;
		} // # of files in dir

		// Information about each column.
		public String getColumnName(int col) {
			return columnNames[col];
		}

		public Class getColumnClass(int col) {
			return columnClasses[col];
		}

		public Object getValueAt(int row, int col) {
			File f = new File(dir, filenames[row]);
			switch (col) {
			case 0:
				return filenames[row];
			case 1:
				return new Long(f.length());
			case 2:
				return new Date(f.lastModified());
			case 3:
				return f.isDirectory() ? Boolean.TRUE : Boolean.FALSE;
			case 4:
				return f.canRead() ? Boolean.TRUE : Boolean.FALSE;
			case 5:
				return f.canWrite() ? Boolean.TRUE : Boolean.FALSE;
			default:
				return null;
			}
		}
	}

	class SharedListSelectionHandler implements ListSelectionListener {
		public void valueChanged(ListSelectionEvent e) {
			// ListSelectionModel lsm = (ListSelectionModel) e.getSource();

			System.out.println("es klappt");
		}
	}
}
 
[JAVA=107] sp.setLeftComponent(new JScrollPane(new JTable(model)));

listSelectionModel = table.getSelectionModel();
listSelectionModel
.addListSelectionListener(new SharedListSelectionHandler());
table.setSelectionModel(listSelectionModel);[/code]

Meine Vermutung hat sich bestätigt, die Tabelle mit dem SelectionListener wird gar nicht in der GUI verwendet (s. Zeile 107). Du fügst da eine komplett neue Tabelle ein!
 
Stimmt, da ich ja jetzt die Tabelle ober erzeuge muus die Zeile so lautet:

Java:
	public void createAndAddSplitPane() {
		sp.setLeftComponent(new JScrollPane(table));

		listSelectionModel = table.getSelectionModel();
		listSelectionModel
				.addListSelectionListener(new SharedListSelectionHandler());
		table.setSelectionModel(listSelectionModel);

		sp.setRightComponent(new JScrollPane(new JTextArea()));
	}
 
Und so müsste ich dann doch die Ausgabe in der unteren Fensterhälfte realisieren können oder?

Java:
// Output
	JTextArea output;

Java:
	public void createAndAddSplitPane() {
		sp.setLeftComponent(new JScrollPane(table));

		listSelectionModel = table.getSelectionModel();
		listSelectionModel
				.addListSelectionListener(new SharedListSelectionHandler());
		table.setSelectionModel(listSelectionModel);

		output = new JTextArea();
		output.setEditable(false);

		sp.setRightComponent(new JScrollPane(output));
	}
 
ja, so funktioniert es 🙂

Noch eine hoffentlich letzte Frage, wie bekomme ich den Wert der in der ersten Zelle einer Tabelle steht wieder ausgelesen, ich brauche ja das Verzeichnis (dir) plus den Namen der Datei um diese dann anzeigen zu lassen.
 
Das Funktioniert Danke, aber die Ausgabe der Dateien in der Console wie auch im Fenster klappt nicht.

Zeile 270: "The method append(String) in the type JTextArea is not applicable for the arguments (char)"

Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;

public class FileBrowser extends JFrame {

	// default & aktuelles Verzeichnis
	File dir = new File("C:\\");

	// Verzeichnisbaum
	private JFileTree t = new JFileTree();

	// Header Pfadangabe
	private JLabel l = new JLabel(" ");

	// Hauptfenster JTable & JTextArea
	JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);

	// TableModel
	FileTableModel model = new FileTableModel(dir);
	JTable table = new JTable(model);

	// ListSelectionModel
	ListSelectionModel listSelectionModel;

	// Output
	JTextArea output;

	public FileBrowser() {
		super("FileBrowser");

		createAndAddSplitPane();

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		this.setSize(1024, 800);

		t.getSelectionModel().addTreeSelectionListener(
				new TreeSelectionListener() {
					private File file;
					private File[] files;
					private DefaultMutableTreeNode dmt;
					private Object[] o;
					private String s = "";

					public void valueChanged(TreeSelectionEvent e) {
						dmt = null;
						dmt = (DefaultMutableTreeNode) e
								.getNewLeadSelectionPath()
								.getLastPathComponent();

						o = dmt.getUserObjectPath();
						s = "";
						for (Object ob : o) {
							s = s + ob;
						}

						file = new File(s);

						l.setText(file.getAbsolutePath());

						if (file.isDirectory())
							if ((files = file.listFiles()).length > 0) {
								dmt.removeAllChildren();
								for (int ast = 0; ast < files.length; ast++) {
									if (files[ast].isDirectory())
										dmt.add(new DefaultMutableTreeNode(
												files[ast].getName() + "\\"));
								}
								t.validate();
							}

						// Auslesen der Files in einem Verzeichnis
						File dir = new File(file.getAbsolutePath());
						model.setDir(dir);

					}
				});

		this.add(l, BorderLayout.NORTH);
		this.add(new JScrollPane(t), BorderLayout.WEST);
		this.add(new JScrollPane(sp), BorderLayout.CENTER);
		sp.setOneTouchExpandable(true);
		sp.setContinuousLayout(true);

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new FileBrowser();
	}

	public void createAndAddSplitPane() {
		sp.setLeftComponent(new JScrollPane(table));

		listSelectionModel = table.getSelectionModel();
		listSelectionModel
				.addListSelectionListener(new SharedListSelectionHandler());
		table.setSelectionModel(listSelectionModel);

		output = new JTextArea();
		output.setEditable(false);

		sp.setRightComponent(new JScrollPane(output));
	}

	class JFileTree extends JTree {

		public JFileTree() {
			this.setModel(new DefaultTreeModel(this.getRoot()));
			this.setCellRenderer(new FileRenderer());
		}

		public DefaultMutableTreeNode getRoot() {
			File[] files = dir.listFiles();
			DefaultMutableTreeNode root = new DefaultMutableTreeNode(dir
					.getPath());
			for (int ast = 0; ast < files.length; ast++) {
				if (files[ast].isDirectory())
					root.add(new DefaultMutableTreeNode(files[ast].getName()
							+ "\\"));
			}
			return root;
		}

		class FileRenderer extends DefaultTreeCellRenderer {
			private Icon directoryIcon;

			public FileRenderer() {
				directoryIcon = this.getDefaultClosedIcon();
			}

			@Override
			public Component getTreeCellRendererComponent(JTree tree,
					Object value, boolean sel, boolean expanded, boolean leaf,
					int row, boolean hasFocus) {

				super.getTreeCellRendererComponent(tree, value, sel, expanded,
						leaf, row, hasFocus);
				if (isDirectory(value))
					setIcon(directoryIcon);
				return this;
			}

			private Object[] o;
			private String s;
			private File file;

			protected boolean isDirectory(Object value) {
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
				o = node.getUserObjectPath();
				s = "";
				for (Object ob : o) {
					s = s + ob;
				}
				file = new File(s);
				if (file.isDirectory())
					return true;
				else
					return false;
			}
		}
	}

	class FileTableModel extends AbstractTableModel {

		protected File dir;
		protected String[] filenames;

		protected String[] columnNames = new String[] { "name", "size",
				"last modified", "type directory?", "readable?", "writable?" };

		protected Class[] columnClasses = new Class[] { String.class,
				Long.class, Date.class, Boolean.class, Boolean.class,
				Boolean.class };

		public void setDir(File dir) {
			this.dir = dir; // neues dir übernehmen
			this.filenames = dir.list();
			this.fireTableDataChanged(); // dem View (JTable) mitteilen, dass
			// sich die Daten geändert haben
		}

		// This table model works for any one given directory
		public FileTableModel(File dir) {
			this.dir = dir;
			this.filenames = dir.list(); // Store a list of files in the
			// directory
		}

		// These are easy methods.
		public int getColumnCount() {
			return 6;
		} // A constant for this model

		public int getRowCount() {
			return filenames.length;
		} // # of files in dir

		// Information about each column.
		public String getColumnName(int col) {
			return columnNames[col];
		}

		public Class getColumnClass(int col) {
			return columnClasses[col];
		}

		public Object getValueAt(int row, int col) {
			File f = new File(dir, filenames[row]);
			switch (col) {
			case 0:
				return filenames[row];
			case 1:
				return new Long(f.length());
			case 2:
				return new Date(f.lastModified());
			case 3:
				return f.isDirectory() ? Boolean.TRUE : Boolean.FALSE;
			case 4:
				return f.canRead() ? Boolean.TRUE : Boolean.FALSE;
			case 5:
				return f.canWrite() ? Boolean.TRUE : Boolean.FALSE;
			default:
				return null;
			}
		}
	}

	class SharedListSelectionHandler implements ListSelectionListener {
		public void valueChanged(ListSelectionEvent g) {

			Object name = table.getValueAt(table.getSelectedRow(), 0);
			System.out.println(name);

			FileReader f;
			int c;

			try {
				f = new FileReader(dir + "//" + name);
				while ((c = f.read()) != -1) {
					System.out.print((char) c);
				}
				f.close();
			} catch (IOException e) {
				System.out.println("Fehler beim Lesen der Datei");
			}
			output.append( (char) c);

		}
	}
}
 
Noch eine hoffentlich letzte Frage
Die Hoffnung stirbt zu letzt ;-)

So wie ich das sehe willst Du eine Datei auslesen und deren Inhalt in der TextArea darstellen. Dein c ist ja nur das zuletzt eingelesene Zeichen. Such doch mal hier im Forum ein bisschen rum, da gibt's massig Beispiele zum einlesen einer Datei. z.B. Stichwort: BufferedReader
 
Die Hoffnung stirbt zu letzt

immer auf die Kleinen


Den BufferedReader brauch ich doch nur für die Ausgabe in der GUI. In der Konsole aber sollte die Datei doch auf jeden Fall angezeigt werden. Ich habe die Funktion zuerst für sich allein geschrieben und da funktioniert es.

Java:
 /* ShowFile.java */
 
 import java.io.*;
 
 public class ShowFile
 {
   public static void main(String[] args)
   {
     FileReader f;
     int c;
 
     try {
       f = new FileReader("D:\\SYS\\windows7.html");
       while ((c = f.read()) != -1) {
          System.out.print((char)c);
       }
       f.close();
     } catch (IOException e) {
       System.out.println("Fehler beim Lesen der Datei");
     }
   }
 }
 
Das funktioniert, da Du Zeichen für Zeichen aus der Datei einliest und ebenso auf der Konsole wieder ausgibst. Für die Ausgabe im TextArea ist es sinnvoll diese Zeichen in z.B. eine StringBuffer zu speichern, und erst wenn die Datei komplett (abhängig von der Größe der Datei) eingelesen ist, diesen im TextArea anzuzeigen.
Der BufferedReader ermöglicht Dir dabei u.U. das Einlesen kompletter Zeilen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben