JTable - Anwendungen - Teil 1 - FileManager

Status
Nicht offen für weitere Antworten.
B

Beni

Gast
Roar hat gesagt.:
JTable - Anwendungen 1 - FileManager

Im Folgenden noch ein Beispiel zu dem TableEditor und CellRenderer in Einem.
Dieses Beispiel kann man gut für Datei Manager anwenden, es ist auch ein Teil meines FileManager Programms. Es ist ein Editor der es erlaubt bei Doppelklick auf deine Zelle den Dateinamen zu ändern, aber das Icon der Datei sichtbar bleibt. Das ist nur ein kleiner Anriss und selbstverständlich nicht komplett oder fehlerfrei, aber zum Ausbauen gut geeignet.

Java:
//FileTableEditingCell.java - Der Editor Component
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import javax.swing.filechooser.FileSystemView;

class FileTableEditingCell extends JPanel implements KeyListener {
	
	protected JTextField tf;
	protected JLabel icon;
	protected File f;
	private TableCellEditor editor;
	
	public FileTableEditingCell(File f, TableCellEditor editor) {
		FileSystemView fsv = FileSystemView.getFileSystemView();
		tf = new JTextField(fsv.getSystemDisplayName(f), 20);
		icon = new JLabel(fsv.getSystemIcon(f));
		this.f = f;
		this.editor = editor;
		setLayout(new BorderLayout());
		add(icon, BorderLayout.WEST);
		add(tf, BorderLayout.CENTER);
		tf.addKeyListener(this);
	}
	
	public FileTableEditingCell(File f, boolean showIcon,TableCellEditor editor) {
		FileSystemView fsv = FileSystemView.getFileSystemView();
		tf = new JTextField(fsv.getSystemDisplayName(f), 20);
		icon = new JLabel(fsv.getSystemIcon(f));
		this.f = f;
		this.editor = editor;
		setLayout(new BorderLayout());
		if(showIcon)
			add(icon, BorderLayout.WEST);
		add(tf, BorderLayout.CENTER);
		tf.addKeyListener(this);
	}
	
	public String getText() {
		return tf.getText();
	}
	
	public File getFile() {
		return f;
	}
	
	public void keyPressed(KeyEvent e) {
 		boolean stop = e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_TAB || e.isActionKey();
 		if(e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_CAPS_LOCK)
 			stop = false; 
 		if(stop) {
 			((FileTableCellEditor)editor).cancelEditing(tf.getText());
 		}
	}
	
 	public void keyReleased(KeyEvent e) {
 	}
 	
 	public void keyTyped(KeyEvent e) {
 	}
}


// FileTableCellEditor.java - Der Editor


import java.awt.*;
import java.io.File;
import java.util.Date;
import java.text.SimpleDateFormat;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.filechooser.FileSystemView;


public class FileTableCellEditor extends DefaultCellEditor {
	
	protected FileTable table;
	private FileTableEditingCell editorComponent;
	
	public FileTableCellEditor(FileTable table) {
		super(new JTextField());
		this.table = table;
	}

	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
		String columnName = (String)table.getColumnModel().getColumn(column).getHeaderValue();
		File f = (File)value;
		if(this.table.getRenderer().getRenderMode() == FileTableCellRenderer.DETAILS) {
			if(columnName.equals("Name")) {
				editorComponent = new FileTableEditingCell(f, this);
				return editorComponent;
			}
			return null;		
		} else if(this.table.getRenderer().getRenderMode() == FileTableCellRenderer.THUMBNAIL) {
			editorComponent = new FileTableEditingCell(f, false, this);
			return editorComponent;
		}
		return null;
	}
	
	public void cancelEditing(int row, int col) {
		if(editorComponent != null) {
			File f = editorComponent.getFile();
			File newFile = new File(f.getParent()+ "\\" + editorComponent.getText());
			f.renameTo(newFile);
			newFile.setLastModified(System.currentTimeMillis());
			if(table.getRenderer().getRenderMode() == FileTableCellRenderer.DETAILS) {
				((DefaultTableModel)table.getModel()).insertRow(row, new File[]{newFile, newFile, newFile, newFile});
				((DefaultTableModel)table.getModel()).removeRow(row+1);
			} else if(table.getRenderer().getRenderMode() == FileTableCellRenderer.THUMBNAIL) {
				((DefaultTableModel)table.getModel()).setValueAt(newFile, row, col);
			}
		}
		editorComponent = null;
		cancelCellEditing();
	}
	
	public void cancelEditing(String newName) {
		File f = (File)table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
		File newFile = new File(f.getParent()+ "\\" + newName);
		f.renameTo(newFile);
		newFile.setLastModified(System.currentTimeMillis());
		if(table.getRenderer().getRenderMode() == FileTableCellRenderer.DETAILS) {
			((DefaultTableModel)table.getModel()).insertRow(table.getSelectedRow(), new File[]{newFile, newFile, newFile, newFile});
			((DefaultTableModel)table.getModel()).removeRow(table.getSelectedRow()+1);		
		} else if(table.getRenderer().getRenderMode() == FileTableCellRenderer.THUMBNAIL) {
			((DefaultTableModel)table.getModel()).setValueAt(newFile, table.getSelectedRow(), table.getSelectedColumn());
		}
		cancelCellEditing();
	}
}
Folgendes ist der CellRenderer für die Table. Es sind teilweise shcon andere Darstellungsmodi eingebaut, die aber noch nicht richtig funktionieren und eigentlich nur zum Testen da sind. Wenn man will kann man sie halt erweitern. Der Editor ist im Moment nur für den DETAILS Modus implementiert.

Java:
// FileTableCellRenderer.java - Der Renderer
import java.awt.*;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.filechooser.FileSystemView;


public class FileTableCellRenderer implements TableCellRenderer {
	
	public static final int THUMBNAIL = 0;
	public static final int LIST = 1;
	public static final int DETAILS = 2;
	
	protected int rendermode = DETAILS;
	
	public FileTableCellRenderer() {
		
	}

	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		if(value == null)
			return null;
		JLabel label = new JLabel(value.toString());
		String columnName = (String)table.getColumnModel().getColumn(column).getHeaderValue();
		FileSystemView fsv = FileSystemView.getFileSystemView();
		File f;
		if(value instanceof File) {
			f = (File)value;
		} else {
			((FileTableCellEditor)table.getDefaultEditor(Object.class)).cancelEditing(row, column);
			f = (File)table.getValueAt(row, column);
		}
		if(rendermode == DETAILS) {
			table.getTableHeader().setVisible(true);
			if(columnName.equals("Name")) {
				label = new JLabel(fsv.getSystemDisplayName(f), fsv.getSystemIcon(f), SwingConstants.LEFT);
			} else if(columnName.equals("Size")) {
				label = new JLabel(Math.round((float)(f.length()/1024))+" KB", SwingConstants.RIGHT);
			} else if(columnName.equals("Type")) {
				label = new JLabel(fsv.getSystemTypeDescription(f));
			} else if(columnName.equals("Last modified")) {
				label = new JLabel(new SimpleDateFormat("dd.MM.yyyy HH:mm").format(new Date(f.lastModified())));
			}
		} else if(rendermode == THUMBNAIL) {
			table.getTableHeader().setVisible(false);
			if(RexFileSystemView.getRexFileSystemView().isSupportedImage(f)) {
				label = new JLabel(fsv.getSystemDisplayName(f), new ImageIcon(f.getPath()), SwingConstants.CENTER);
				label.setVerticalTextPosition(SwingConstants.BOTTOM);
			} else {
				label = new JLabel(fsv.getSystemDisplayName(f), fsv.getSystemIcon(f), SwingConstants.CENTER);
				label.setVerticalTextPosition(SwingConstants.BOTTOM);
			}
			table.setRowHeight(120);
		}
		label.setOpaque(true);
		label.setBorder(BorderFactory.createEmptyBorder(1,1,1,1));
		label.setFont(table.getFont());
		label.setForeground(table.getForeground());
		label.setBackground(table.getBackground());
		if(hasFocus) {
			label.setBackground((Color)UIManager.getDefaults().get("Table.focusCellBackground"));
			label.setForeground((Color)UIManager.getDefaults().get("Table.focusCellForeground"));
			if(columnName.equals("Name") || rendermode == THUMBNAIL) {
				label.setBorder((javax.swing.border.Border)UIManager.getDefaults().get("Table.focusCellHighlightBorder"));
				label.setBackground(table.getSelectionBackground());
				label.setForeground(table.getSelectionForeground());
			}
		}
		return label;
	}
	
	public void setRenderMode(int i) {
		if(i > 2)
			throw new IllegalArgumentException("Parameter i must be THUMBNAIL, LIST or DETAILS");
		rendermode = i;
	}
	
	public int getRenderMode() {
		return rendermode;
	}
}

Das Alles kann eingebaut werden mit einer Instanz von FileTable.java

Java:
// FileTable.java - Alles in Einem

import java.awt.Dimension;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class FileTable extends JTable {
	
	protected FileTableCellRenderer renderer;
	protected FileTableCellEditor editor;
	
	public FileTable(DefaultTableModel model) {
		super(model);
		setShowGrid(false);
		setIntercellSpacing(new Dimension(5,0));
		renderer = new FileTableCellRenderer();
		editor = new FileTableCellEditor(this);
		setDefaultEditor(Object.class, editor);
		setDefaultRenderer(Object.class, renderer);
		setRowSelectionAllowed(false);
	}
	
	public FileTableCellRenderer getRenderer() {
		return renderer;
	}
	
	public FileTableCellEditor getEditor() {
		return editor;
	}
}

Und so wird das ganze implementiert:

Java:
DefaultTableModel model = new DefaultTableModel(new String[]{"Name","Size","Type","Last modified"}, 0);
FileTable tab = new FileTable(model);
anyContainer.add(new JScrollPane(tab));

Und so kann das am Ende mal aussehen:

FileManager.jpg

© August 2004
Dieses Tutorial unterliegt dem Copyright, Kopien (auch nur von Teilen) sind nur für nicht-komerzielle Zwecke gestattet; Detailfragen (insbesondere bei Unsicherheiten), bitte direkt an die Autoren.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben