/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package practica1.ui.tablaPoblacion;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.EventObject;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import practica1.util.JTextFieldNumerico;
/**
* Clase que implementa un TableCellEditor y la cual devuelve un JTextFieldNumerico
* para permitir solo escribir números en la tabla
* @author Miguel González - Ceura
*/
public class TablaCellEditorTextField implements TableCellEditor {
//TextField que es el objeto editable
private JTextFieldNumerico textField;
//Eventos que se producen
private ArrayList<CellEditorListener> cellEditorListener;
protected ChangeEvent changeEvent = new ChangeEvent(this);
//Contendrá la fila y columna del elemento que se esté editando actualmente
private int row;
private int column;
/**
* Constructor por defecto del cell editor
*/
public TablaCellEditorTextField() {
//Nuestro textfield sólo permite números
textField = new JTextFieldNumerico();
//Creamos un listener
cellEditorListener = new ArrayList<CellEditorListener>();
}
/**
* Devuelve el componente que se va a representar en pantalla que permite
* al usuario editar el campo (JTextEditor)
* @param table Tabla que llama al cell editor
* @param value Valor que va a ser editado
* @param isSelected Devuelve verdad si la celda está seleccionada, sino falso
* @param row Fila de la celda
* @param column Columna de la celda
* @return Devuelve el componente que representa el editor del campo
*/
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
//Actualizamos la fila y columna del elemento editable
this.row = row;
this.column = column;
//Agregamos el valor de la fila/columna al textfield
textField.setText((String)value);
//Le decimos que estará todo el texto seleccionado por defecto
textField.selectAll();
//Devolvemos el textfield
return textField;
}
/**
* Devuelve el valor que ha editado el usuario
* @return Object Objeto de tipo String
*/
@Override
public Object getCellEditorValue() {
//Devolvemos el valor de la celda
return textField.getText();
}
/**
* Devuelve la fila que ha editado el usuario
* @return int row
*/
public int getRow() {
return row;
}
/**
* Devuelve la columna que ha editado el usuario
* @return int column
*/
public int getColumn() {
return column;
}
/**
* Devuelve si la celda es editable o no lo es, solo permitimos editar con
* doble click sobre la misma.
* @param evt EventObject
* @return Devuelve verdad si lo es, sino falso.
*/
@Override
public boolean isCellEditable(EventObject evt) {
if (evt instanceof MouseEvent) {
return ((MouseEvent)evt).getClickCount() >= 2;
}
return false;
}
/**
* Devuelve si la celda debe ser seleccionada al editarse
* @param anEvent EventObject
* @return Devuelve siempre true
*/
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
/**
* Devuelve si la ceda ha dejado de ser editable, además notifica de ello
* @return Devuelve siempre verdad
*/
@Override
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
/**
* Notifica que se ha cancelado la edición
*/
@Override
public void cancelCellEditing() {
fireEditingCanceled();
}
/**
* Permite escuchar al cell editor
* @param l CellEditorListener
*/
@Override
public void addCellEditorListener(CellEditorListener l) {
if(l != null) {
cellEditorListener.add(l);
}
}
/**
* Permite dejar de escuchar al cell editor
* @param l
*/
@Override
public void removeCellEditorListener(CellEditorListener l) {
cellEditorListener.remove(l);
}
/**
* Notifica a todos los que escuchan al cell editor que se ha dejado de editar
*/
protected void fireEditingStopped() {
for (int i = 0; i < cellEditorListener.size(); i++) {
cellEditorListener.get(i).editingStopped(changeEvent);
}
}
/**
* Notifica a todos los que escuchan al cell editor que se ha cancelado la edición
*/
protected void fireEditingCanceled() {
for (int i = 0; i < cellEditorListener.size(); i++) {
cellEditorListener.get(i).editingCanceled(changeEvent);
}
}
}