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;
		}
	}
}
 

Michael...

Top Contributor
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
 

mstoetzer

Mitglied
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:

Michael...

Top Contributor
[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
 

Michael...

Top Contributor
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:

mstoetzer

Mitglied
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.
 

Michael...

Top Contributor
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());
 

mstoetzer

Mitglied
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");
		}
	}
 

Michael...

Top Contributor
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.
 

mstoetzer

Mitglied
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");
		}
	}
}
 

Michael...

Top Contributor
[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!
 

mstoetzer

Mitglied
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()));
	}
 

mstoetzer

Mitglied
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));
	}
 

mstoetzer

Mitglied
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.
 

mstoetzer

Mitglied
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);

		}
	}
}
 

Michael...

Top Contributor
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
 

mstoetzer

Mitglied
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");
     }
   }
 }
 

Michael...

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JTable SelectionListener AWT, Swing, JavaFX & SWT 7
C Mit SelectionListener herausfinden welche zeile in Jtable angeklickt wurde AWT, Swing, JavaFX & SWT 5
J Swing JTable SelectionListener AWT, Swing, JavaFX & SWT 5
H JTable und SelectionListener AWT, Swing, JavaFX & SWT 15
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben