TableCellEditor (Java API)

Aus Byte-Welt Wiki
Wechseln zu: Navigation, Suche

Ein TableCellEditor wird von einer JTable benutzt, um dem Benutzer die Möglichkeit zu bieten, einzelne Zellen der Tabelle zu bearbeiten. Die JTable geht dabei immer gleich vor: zuerst wird die Methode getTableCellEditor aufgerufen. Diese Methode gibt eine Component zurück, welche auf der JTable angezeigt wird. Der Benutzer kann diesen Editor solange verwenden, bis der TableCellEditor oder die JTable die Methode stopCellEditing oder cancelCellEditing aufruft. Diese Methoden feuern ein Event in die registrierten CellEditorListener, müssen aber weiter nichts tun. Wurde das Stop-Event gefeuert, so wird der Editor nach seinem aktuellen Wert befragt (über die Methode getCellEditorValue), und dieser Wert wird in das TableModel geschrieben. Wurde hingegen das Cancel-Event gefeuert, wird die Aktion einfach abgebrochen, und die Veränderungen verworfen.

Ein einfacher TableCellEditor könnte folgendermassen aussehen:

import java.awt.Component;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.List;
 
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
 
/**
 * Ein einfacher TableCellEditor der ein String in einem
 * Textfeld darstellt.
 */
public class DemoEditor implements TableCellEditor{
	/** das Textfeld des Editors */
	private JTextField textField = new JTextField();
	/** Observer des Editors */
	private List<CellEditorListener> listeners = new ArrayList<CellEditorListener>();
 
	// Prepariert den Editor, so dass ein neuer Wert angezeigt wird.
	public Component getTableCellEditorComponent( 
			JTable table, Object value, boolean isSelected, int row, int column ){
 
		textField.setText( String.valueOf( value ) );
		return textField;
	}
 
	public void addCellEditorListener( CellEditorListener l ){
		listeners.add( l );
	}
 
	public void removeCellEditorListener( CellEditorListener l ){
		listeners.remove( l );
	}
 
	// Gibt den aktuellen Wert des Editors zurück.
	public Object getCellEditorValue(){
		return textField.getText();
	}
 
	public boolean isCellEditable( EventObject anEvent ){
		return true;
	}
 
	public boolean shouldSelectCell( EventObject anEvent ){
		return true;
	}
 
	// Informiert alle Observer, dass die Aktion abgebrochen wurde.
	public void cancelCellEditing(){
		ChangeEvent event = new ChangeEvent( this );
		for( CellEditorListener listener : 
			listeners.toArray( new CellEditorListener[ listeners.size() ] )){
 
			listener.editingCanceled( event );
		}
	}
 
	// Informiert alle Observer, dass der Wert gespeichert werden soll.
	public boolean stopCellEditing(){
		ChangeEvent event = new ChangeEvent( this );
		for( CellEditorListener listener : 
			listeners.toArray( new CellEditorListener[ listeners.size() ] )){
 
			listener.editingStopped( event );
		}
 
		// informiert den Aufrufer, dass der Input korrekt ist.
		return true;
	}
}